无法接收ACTION_PACKAGE_REMOVED与ACTION_PACKAGE_INSTALLED广播问题
问题排查与修复方案
1. 替换废弃的广播Action
android.intent.action.PACKAGE_INSTALL 已被废弃,无法正常接收安装事件,需替换为以下有效Action:
Intent.ACTION_PACKAGE_ADDED:应用被添加到设备时触发(包含替换安装场景)Intent.ACTION_PACKAGE_FULLY_INSTALLED:应用完成完整安装(包括解压、优化等步骤)时触发
2. 补充安装事件的处理逻辑
原代码仅处理了卸载事件,需添加安装相关Action的分支逻辑才能捕获安装行为。
3. 优化广播接收器代码
修改后的AppChangesReceiver.kt:
class AppChangesReceiver : BroadcastReceiver() { companion object { private const val TAG = "PackageChangeReceiver" } override fun onReceive(context: Context, intent: Intent) { Log.d(TAG,"Received Broadcast: ${intent.action}") val packageName = intent.data?.encodedSchemeSpecificPart ?: "unknown" when(intent.action) { Intent.ACTION_PACKAGE_REMOVED -> { // 判断是否是替换安装(此时应用并未真正卸载) val isReplacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) if (!isReplacing) { Log.d(TAG, "Package removed: $packageName") showToast(context, "Package removed: $packageName") } } Intent.ACTION_PACKAGE_ADDED -> { val isReplacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) if (!isReplacing) { Log.d(TAG, "Package installed: $packageName") showToast(context, "Package installed: $packageName") } else { Log.d(TAG, "Package replaced: $packageName") showToast(context, "Package replaced: $packageName") } } Intent.ACTION_PACKAGE_FULLY_INSTALLED -> { Log.d(TAG, "Package fully installed: $packageName") showToast(context, "Package fully installed: $packageName") } } } private fun showToast(context: Context, message: String) { // 广播中显示Toast需使用ApplicationContext,避免上下文异常 Toast.makeText(context.applicationContext, message, Toast.LENGTH_LONG).show() } }
4. 更新Manifest中的广播配置
替换废弃的Action,确保IntentFilter包含正确的Action:
<receiver android:name=".AppChangesReceiver" android:exported="true" tools:ignore="ExportedReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_FULLY_INSTALLED" /> <data android:scheme="package" /> </intent-filter> </receiver>
额外注意事项
- 卸载当前应用时,系统不会向自身发送
ACTION_PACKAGE_REMOVED广播,这是系统限制。 - Android 8.0及以上版本中,
PACKAGE_*系列广播仍支持静态注册,无需动态注册。 - 查看日志时,确保Logcat过滤标签设置为
PackageChangeReceiver,避免遗漏日志。
内容的提问来源于stack exchange,提问作者Dhruv Kushvaha
相关产品推荐
相关产品推荐

