Android开发:ActivityCompat用法、Context参数作用及传this原因
你可以把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一致,不会绑定单个页面。
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

