Android API26及以上接收隐式广播及应用更新广播接收异常咨询
解决方案
方案1:优化动态注册逻辑(适配全版本,监听所有应用更新/卸载)
ACTION_PACKAGE_REPLACED动态注册收不到大多是权限和配置缺失导致,调整如下:
- 针对Android12(API31)及以上版本,动态申请
QUERY_ALL_PACKAGES权限,否则系统会拦截你获取其他应用的包变更事件 - 注册IntentFilter时提升广播优先级,避免被系统拦截
- 若仅需要监听自身应用的更新,额外添加
ACTION_MY_PACKAGE_REPLACEDAction,该广播不受API26+隐式广播限制,可靠性更高
优化后的代码实现:
val mIntentFilter = IntentFilter() mIntentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED) mIntentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED) // 新增自身应用更新监听,兼容高版本系统限制 mIntentFilter.addAction(Intent.ACTION_MY_PACKAGE_REPLACED) mIntentFilter.addDataScheme("package") // 提升广播优先级 mIntentFilter.priority = IntentFilter.SYSTEM_HIGH_PRIORITY // 前台服务上下文注册,只要服务存活就能正常接收 registerReceiver(applicationReceiver, mIntentFilter)
方案2:静态注册豁免广播(仅监听自身应用更新场景)
ACTION_MY_PACKAGE_REPLACED属于官方豁免的隐式广播,不需要动态注册,直接在清单文件中配置即可,哪怕应用未启动也能收到更新事件:
<receiver android:name=".ApplicationReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> </intent-filter> </receiver>
方案3:后台稳定监听替代方案
如果需要在应用退后台、前台服务被清理的场景下仍能接收应用变更事件,可以用JobScheduler定期轮询系统已安装应用列表,和本地缓存的包名、版本号、安装时间做对比,判断是否有应用被更新或卸载,系统允许的最短轮询间隔为15分钟。
如果是设备管理类应用,可以申请设备管理员权限或辅助功能权限,获取更高的系统权限优先级,不受后台广播限制。
注意事项
- 若应用上架Google Play,申请
QUERY_ALL_PACKAGES权限需要向谷歌提交合理的使用场景说明,否则会被驳回 - Android12及以上版本启动前台服务需要申请对应类别的前台服务权限,且必须显示常驻通知,否则服务会被系统强制清理
内容的提问来源于stack exchange,提问作者Alireza Lorestani
相关产品推荐
相关产品推荐

