Android点击通知触发Broadcast Receiver收到相同Intent字符串问题
问题根源
你的问题核心出在通知关联的PendingIntent配置上。Android系统判定两个PendingIntent是否为同一个的依据是:Intent的action、data、type、组件类、category 字段完全一致,且requestCode相同,不管Extra参数是否不同,都会被判定为同一个实例,默认复用首次创建的PendingIntent,不会更新Extra内容,所以你后续点击通知始终拿到第一次的参数。
修复方案
修改PendingIntent的创建逻辑,任选以下一种方案即可:
方案1:使用FLAG_UPDATE_CURRENT标志位
创建PendingIntent时添加FLAG_UPDATE_CURRENT标志,要求系统如果存在相同的PendingIntent,就用新Intent的Extra替换原有内容。
如果是Android 12(API 31)及以上版本,需要额外搭配FLAG_MUTABLE允许修改PendingIntent内容:
// 原有Intent创建逻辑不变 Intent snoozeIntent = new Intent(getApplicationContext(), ServiceLauncherBroadcast.class); snoozeIntent.putExtra("order_id", orderId); int pendingFlag; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { pendingFlag = PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE; } else { pendingFlag = PendingIntent.FLAG_UPDATE_CURRENT; } PendingIntent pendingIntent = PendingIntent.getBroadcast( getApplicationContext(), 0, // requestCode不变也可以生效 snoozeIntent, pendingFlag ); // 把该pendingIntent设置给通知的点击事件即可
方案2:设置唯一requestCode
如果你不需要复用PendingIntent,可以给每个PendingIntent传入唯一的requestCode(比如使用当前时间戳、或者orderId的哈希值),系统会判定为不同的PendingIntent,不会复用历史实例,自然就能拿到最新的Extra参数:
PendingIntent pendingIntent = PendingIntent.getBroadcast( getApplicationContext(), (int) System.currentTimeMillis(), // 唯一requestCode snoozeIntent, PendingIntent.FLAG_IMMUTABLE // 不需要修改的话可以用不可变标志,更安全 );
内容的提问来源于stack exchange,提问作者Ashish Singh
相关产品推荐
相关产品推荐

