Android 11/12无法接收Intent.ACTION_PACKAGE_ADDED广播事件问题
问题根因
你无法接收Intent.ACTION_PACKAGE_ADDED事件的核心原因是Android 11(API 30)引入的包可见性过滤规则,和你的广播注册、接收器实现代码无关:
- Android 11开始,系统默认禁止应用感知其他第三方应用的存在/安装事件,
ACTION_PACKAGE_ADDED作为新应用出现的事件,会严格遵循包可见性规则下发:只有有权限查询到新安装应用的App,才能收到该广播。 - 你能正常收到
ACTION_PACKAGE_REMOVED和ACTION_AIRPLANE_MODE_CHANGED是规则设计如此:应用卸载事件属于「已有对象消失」类事件,不受包可见性限制;飞行模式变化是全局系统状态事件,也不受该规则约束。 - 你在Logcat中看到的
Background execution not allowed日志是谷歌GMS组件的接收报错,和你的App无关,不需要处理。 - 你代码中设置的
intentFilter.priority = 999对系统包事件广播无效,系统对第三方应用的广播接收优先级有强制上限,设置过高值不会让你更早收到事件,无实际作用。
修复步骤
- 配置包可见性权限
打开你的AndroidManifest.xml,在<manifest>节点下添加对应配置:- 如果你需要感知所有第三方应用的安装事件,添加全量包查询权限:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />注意:如果应用需要上架Google Play,申请该权限需要提交合规声明说明使用场景,否则会被拒审。如果只需要感知特定包名、特定intent-filter匹配的应用安装,使用
<queries>标签定向声明即可,无需申请全量权限。 - 兼容Android 13+动态广播注册规则
Android 13(API 33)开始,动态注册广播需要明确指定是否对外导出,否则会抛出异常,修改你的广播注册代码做版本兼容:val intentFilter = IntentFilter().apply { addAction(Intent.ACTION_PACKAGE_ADDED) addAction(Intent.ACTION_PACKAGE_REMOVED) addDataScheme("package") } val rec = IntentReceiver() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { registerReceiver(rec, intentFilter, Context.RECEIVER_EXPORTED) } else { registerReceiver(rec, intentFilter) } - 可选:如果需要应用进程被杀死后也能接收安装事件,可以将广播改为静态注册,
ACTION_PACKAGE_ADDED属于Android 8.0+静态注册豁免的隐式广播,不需要做额外的隐式广播适配,静态注册时同样需要配置上述包可见性权限。
内容的提问来源于stack exchange,提问作者Sachin Singh
相关产品推荐
相关产品推荐

