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

Android开发:ActivityCompat用法、Context参数作用及传this原因

1. Context 是什么、怎么用

你可以把Context直接理解为Android系统给App组件发的办事凭证:不管你是要弹Toast、启动新页面、调用定位/震动等系统服务、读取App内的字符串/图片资源、创建弹窗/控件,所有需要和系统交互、或者访问App内部资源的操作,都必须出示这个凭证,不然系统会直接拒绝你的请求,甚至让程序崩溃。

它的核心作用可以归为三类:

  • 访问App资源:比如拿strings.xml里的文案、drawable里的图片、颜色值等
  • 调用系统服务:比如拉起摄像头、获取位置信息、弹出系统通知、操作震动马达
  • 启动组件:比如启动Activity、Service、发送广播

为什么方法要Context的时候经常传this

this在代码里指代当前类的实例对象。你在Activity里写业务代码的时候,Activity本身就是Context的子类——相当于Activity天生就自带这个合法办事凭证,它自己就是符合参数要求的Context对象,所以直接传this是最方便的选择,不需要额外构造其他Context实例。

Context 正确使用注意事项

  • 和页面强绑定的操作(比如弹Dialog、启动带任务栈的Activity)必须传Activity类型的Context,不能传全局Application的Context,否则会报异常或者出现窗口类型错误。
  • 不要把Activity的Context存成全局变量长期持有:如果Activity已经退出销毁,还被全局变量引用着,会导致内存泄漏。需要全局使用的场景请传getApplicationContext(),这个Context的生命周期和整个App一致,不会绑定单个页面。

2. ActivityCompat 是什么、怎么用

ActivityCompat是官方提供的Activity场景专属兼容工具类,核心作用是解决Android不同系统版本API差异的问题。
Android迭代了十多个大版本,很多新功能是高版本系统才加的,低版本系统根本没有对应方法,如果直接调用新API,App在低版本手机上会直接崩溃。ActivityCompat已经把所有版本判断、兼容兜底的逻辑封装好了,你直接调用它的方法,不需要自己写一堆版本判断的分支代码,就能保证功能在所有系统版本上正常运行。

适用场景

只要是Activity相关的功能、存在系统版本差异的,都可以优先找ActivityCompat的现成方法,最常用的场景包括:

  • 运行时权限申请、权限状态检查(Android 6.0新增的动态权限逻辑,低版本不需要,用ActivityCompat可以自动适配)
  • 页面共享元素转场、跳转动画的多版本兼容
  • 低版本系统下的Activity返回栈逻辑适配
  • 页面内启动其他组件的权限校验兜底

具体使用示例

最常见的动态权限申请代码,不需要自己判断系统版本,直接调用ActivityCompat方法即可:

// 检查相机权限是否已经被用户授权
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    // 未授权则发起权限申请
    // 参数1:当前Activity实例  参数2:要申请的权限列表  参数3:自定义请求码,用于权限回调时识别来源
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), 1001)
}

补充:和它名字类似的ContextCompat是通用兼容工具类,不绑定Activity,在任何持有Context的场景都可以调用,比如获取颜色、图片资源的兼容方法;ActivityCompat的方法都是专门给Activity场景设计的,第一个参数通常要求传入Activity实例。


内容的提问来源于stack exchange,提问作者ADITYA RAJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:06:37