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

无法接收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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:18:16