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

FCM推送通知问题:第二条及后续通知点击无响应求助

FCM多条通知仅第一条可点击打开应用的解决方案

你猜的没错!这个问题确实和manager.notify()的id以及PendingIntent的配置密切相关,核心原因是重复的PendingIntent请求码和不合适的Flag设置,下面给你一步步解决:

问题根源分析

  1. 重复的PendingIntent请求码:你所有的PendingIntent都用了固定的请求码0,Android系统会认为这些是同一个PendingIntent,直接复用之前的实例,导致后续通知点击时触发的还是第一条通知的Intent逻辑。
  2. FLAG_ONE_SHOT的限制:这个标记会让PendingIntent只能被使用一次,第一次点击后这个PendingIntent就失效了,后续相同请求码的PendingIntent点击自然没反应。

具体修复步骤

1. 替换PendingIntent的请求码为唯一通知ID

把创建PendingIntent时的固定请求码0替换为每个通知对应的id(也就是你从FCM消息里获取的NOTIFICATION_ID),确保每个通知的PendingIntent都是独立的。

2. 改用合适的PendingIntent Flag

把PendingIntent.FLAG_ONE_SHOT替换为PendingIntent.FLAG_UPDATE_CURRENT,这个Flag会在PendingIntent已存在时更新它的Extra数据,保证每个通知的Intent参数都是正确的。

修改后的handleIntent方法中PendingIntent相关代码如下:

if (type.equalsIgnoreCase(NOTIFICATION_TYPE_PRODUCT_DETAIL)) {
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(mainIntent);
    stackBuilder.addNextIntent(productIntent);
    // 用通知id作为请求码,替换固定的0,同时改用FLAG_UPDATE_CURRENT
    pendingIntent = stackBuilder.getPendingIntent(id, PendingIntent.FLAG_UPDATE_CURRENT);
} else if (type.isEmpty() || type.equals("")){
    // 同样替换请求码和Flag
    pendingIntent = PendingIntent.getActivity(this, id, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);
} else {
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(mainIntent);
    stackBuilder.addNextIntent(productIntent);
    // 替换请求码和Flag
    pendingIntent = stackBuilder.getPendingIntent(id, PendingIntent.FLAG_UPDATE_CURRENT);
}

3. 确保通知ID的唯一性

额外检查一下服务器发送FCM消息时,是否正确传递了NOTIFICATION_ID字段,并且每个通知的id都是唯一的整数。如果服务器没传或者传的值重复,会导致后续通知覆盖前面的,或者PendingIntent仍然重复。

你代码里获取id的逻辑可以优化一下,避免空字符串导致的默认0:

int id = (int) System.currentTimeMillis(); // 作为备选,如果服务器没传id,用时间戳生成唯一id
try {
    String idStr = intent.getExtras().getString(NOTIFICATION_ID);
    if (idStr != null && !idStr.isEmpty()) {
        id = Integer.parseInt(idStr);
    }
} catch (NumberFormatException e) {
    e.printStackTrace();
}

这样即使服务器没传id,也能生成一个唯一的通知id,避免重复。

验证修复

做完以上修改后,发送多条FCM通知测试,每条通知点击都应该能正确打开对应的页面了,不会再出现只有第一条有效的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:36:22