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
相关产品推荐
相关产品推荐

