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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:15:03