Android Studio中FirebaseMessagingService的PendingIntent在应用杀死状态下失效
应用杀死后通知点击无响应的修复方案
问题根源
应用运行时通知点击正常,但被杀掉后点击通知只会移除通知却不启动页面,核心问题是Intent缺少跨进程启动的必要标记,且PendingIntent的标记适配性不足,导致系统无法在应用未运行时重建栈并启动目标Activity。
具体修复步骤
补充Intent启动标记
从通知(系统进程)启动应用内Activity属于跨进程操作,必须添加Intent.FLAG_ACTIVITY_NEW_TASK标记,才能让系统在应用未运行时创建新任务栈启动页面。同时保留FLAG_ACTIVITY_CLEAR_TOP可以清理栈内重复页面,优化栈行为。修改后的Intent代码:Intent intent = new Intent(this, c); intent.putExtra(NOTIFICATION, oData.toString()); // 新增NEW_TASK标记,保证应用被杀后能启动 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);调整PendingIntent标记
原代码用的FLAG_ONE_SHOT会限制PendingIntent只能使用一次,且在应用重启场景下可能无法正确匹配Intent。建议改用FLAG_UPDATE_CURRENT保证Intent参数能更新,Android 12及以上还需添加FLAG_IMMUTABLE符合安全要求。修改后的代码:int pendingFlags = PendingIntent.FLAG_UPDATE_CURRENT; // Android 12+必须添加IMMUTABLE或MUTABLE标记 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { pendingFlags |= PendingIntent.FLAG_IMMUTABLE; } pendingIntent = PendingIntent.getActivity(this, 0, intent, pendingFlags);检查清单文件配置
确认目标Activity在AndroidManifest.xml中配置正确:- Android 12及以上版本,从外部启动的Activity必须设置
android:exported="true" - 避免设置冲突的
launchMode(比如singleInstance可能导致栈异常)
示例配置:
<activity android:name=".YourTargetActivity" android:exported="true" android:launchMode="standard"> </activity>- Android 12及以上版本,从外部启动的Activity必须设置
验证方法
修改后杀掉应用,发送通知并点击,查看是否能正常启动目标Activity。可以在Activity的onCreate方法中打印getIntent().getStringExtra(NOTIFICATION),确认参数是否正常传递。
内容的提问来源于stack exchange,提问作者raul g h
相关产品推荐
相关产品推荐

