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

Android Widget多实例按钮通知被覆盖:如何配置独立通知?

解决Android Widget多实例按钮点击混淆问题

问题根源

你遇到的问题核心是PendingIntent的requestCode重复。系统判断PendingIntent是否重复时,会对比requestCode、Intent的action、data、type等核心字段,extra并不在匹配逻辑内。你当前所有Widget实例的PendingIntent都使用requestCode = 0,导致新实例的PendingIntent直接覆盖旧的,最终点击第一个Widget按钮时,触发的是最后一个实例的Intent。

修复方案

将requestCode替换为每个Widget实例独有的appWidgetId,让系统识别每个PendingIntent为独立个体,避免覆盖。修改后的代码如下:

val intent = Intent(context, Counter::class.java).also {
    it.setAction(MY_ACTION)
    it.putExtra("appWidgetId", appWidgetId)
}

views.apply {
    setOnClickPendingIntent(
        R.id.button, PendingIntent.getBroadcast(
            context,
            appWidgetId, // 用appWidgetId作为唯一请求码
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
    )
}

关于IMMUTABLE flag的疑问

移除IMMUTABLE flag无法解决你的问题,反而会增加安全风险。该flag是Android 12+推荐的配置,用于限制PendingIntent的Intent不可被后续修改,和PendingIntent的覆盖逻辑完全无关,不需要移除。

额外提醒

  • 在广播接收器中,务必正确读取appWidgetId参数,仅更新对应的Widget实例,不要批量更新所有实例。
  • 若后续需要更新某个Widget的PendingIntent,保持requestCode为对应appWidgetId,使用FLAG_UPDATE_CURRENT即可精准更新该实例,不会影响其他Widget。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:32:11