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

Android 14设备无法接收Intent.ACTION_MY_PACKAGE_REPLACED广播求助

Android 14下MY_PACKAGE_REPLACED广播接收器不触发的解决方法

针对你遇到的Android 14设备上更新应用后广播接收器不工作的问题,按以下步骤排查修复:

1. 修正Manifest中的接收器声明

移除<intent-filter>里的<data android:scheme="package"/>标签,多余的data声明可能导致广播匹配失败。同时将exported设为false(该广播仅系统发送给当前应用,无需对外暴露):

<receiver
    android:name=".common.UpdateReceiver"
    android:enabled="true"
    android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
    </intent-filter>
</receiver>

2. 修复接收器代码的两个关键问题

  • 改用系统Log输出日志,避免自定义Logger在release包中被禁用的情况
  • 启动Activity必须添加FLAG_ACTIVITY_NEW_TASK标记(广播接收器不属于Activity上下文,无此标记会抛出异常)

修改后的代码:

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log

class UpdateReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("upgradeissue", "getting log")
        if (intent?.action == Intent.ACTION_MY_PACKAGE_REPLACED) {
            val packageName = context?.packageName ?: return
            val launchIntent = context.packageManager.getLaunchIntentForPackage(packageName)
            launchIntent?.let {
                it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
                context.startActivity(it)
            }
        }
    }
}

3. 额外排查点

  • 确认包名一致性:检查接收器类的实际包名与Manifest中android:name声明的路径完全匹配
  • 测试广播触发:用adb命令模拟广播,验证接收器是否正常工作:
    adb shell am broadcast -a android.intent.action.MY_PACKAGE_REPLACED -d package://你的应用包名
    
  • 排除首次安装场景:ACTION_MY_PACKAGE_REPLACED仅在更新/替换已安装应用时触发,首次安装不会发送该广播
  • 检查release包日志配置:如果是release版本,确保gradle配置中未禁用Log输出

内容的提问来源于stack exchange,提问作者Esjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:34:56