在Activity类中检查SEND_SMS权限的Context参数及跨Activity调用Context疑问
问题1:如何在类中为其他Activity调用Context
在Android开发中,给其他类提供Context主要有几种安全且常用的方式,核心是要避免内存泄漏:
直接传递Context实例:如果是工具类或者业务类,可以在方法参数里接收Context,或者在类的构造方法中传入。比如:
public class MyUtils { public static void doSomething(Context context) { // 使用context执行操作 } }调用时在Activity里传
this即可,但如果这个类需要长期持有Context,建议用context.getApplicationContext()代替,避免持有Activity的强引用导致内存泄漏。使用全局Application Context:如果你的操作不需要依赖Activity的UI生命周期(比如网络请求、数据库操作),可以获取全局的Application Context,它的生命周期和应用一致,不会引发泄漏。你可以自定义一个Application类:
public class MyApp extends Application { private static Context appContext; @Override public void onCreate() { super.onCreate(); appContext = getApplicationContext(); } public static Context getAppContext() { return appContext; } }然后在Manifest里注册这个Application,之后任何类都可以通过
MyApp.getAppContext()获取全局Context。注意事项:绝对不要在非UI类中持有Activity的强引用(比如把Activity的Context存在静态变量里),除非你能保证这个类的生命周期和Activity完全同步,否则很容易引发内存泄漏问题。
问题2:SEND_SMS权限检查中Context参数的传递
你的SendSms类本身就是继承自Activity的,而Activity是Context的子类,所以这里直接传this就完全没问题!
我帮你修正并补充完整的权限申请逻辑:
public class SendSms extends Activity { // 定义一个权限请求码,用常量避免魔法值 private static final int REQUEST_SMS_PERMISSION = 1; private void checkPermissionSms() { // 这里直接传this作为Context参数 if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_SMS_PERMISSION); } else { // 权限已授予,直接执行发短信逻辑 sendSms(); } } // 重写方法处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_SMS_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户同意权限,执行发短信逻辑 sendSms(); } else { // 用户拒绝权限,提示开启权限 Toast.makeText(this, "需要开启短信权限才能发送短信", Toast.LENGTH_SHORT).show(); } } } private void sendSms() { // 这里编写你的发短信逻辑 } }
简单来说,因为Activity本身就是Context的实现类,所以在Activity内部调用需要Context的方法时,传this就完全符合要求啦。
内容的提问来源于stack exchange,提问作者user9607849

