FCM推送通知问题:第二条及后续通知点击无响应求助
FCM多条通知仅第一条可点击打开应用的解决方案
你猜的没错!这个问题确实和manager.notify()的id以及PendingIntent的配置密切相关,核心原因是重复的PendingIntent请求码和不合适的Flag设置,下面给你一步步解决:
问题根源分析
- 重复的PendingIntent请求码:你所有的
PendingIntent都用了固定的请求码0,Android系统会认为这些是同一个PendingIntent,直接复用之前的实例,导致后续通知点击时触发的还是第一条通知的Intent逻辑。 - 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
相关产品推荐
相关产品推荐

