You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Activity类中检查SEND_SMS权限的Context参数及跨Activity调用Context疑问

你的两个Android技术问题解答

问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:32:52