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

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>
    

验证方法

修改后杀掉应用,发送通知并点击,查看是否能正常启动目标Activity。可以在Activity的onCreate方法中打印getIntent().getStringExtra(NOTIFICATION),确认参数是否正常传递。

内容的提问来源于stack exchange,提问作者raul g h

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:00:48