Android闹钟应用自定义通知按钮点击异常问题求助
解决Android自定义通知的点击事件冲突问题
嘿,我看你在开发Android闹钟应用的自定义通知时碰到了两个头疼的点击问题,其实这俩问题都是同一个原因导致的——PendingIntent的requestCode重复了,咱们来一步步搞定它:
问题根源分析
Android系统判断两个PendingIntent是否为同一个的依据是:Intent的核心属性(比如action、component等)加上requestCode,而Intent里的extra参数并不参与匹配。你现在给三个PendingIntent都用了同一个alarmno作为requestCode,系统会直接认为这是同一个PendingIntent,后面创建的会覆盖前面的,最终导致所有点击事件都指向了最后被设置的那个Intent逻辑,就出现了你遇到的:
- 点击通知本身触发按钮操作,而非预设的主Intent
- 点击第二个按钮却触发第一个按钮的操作
解决方案:给每个PendingIntent设置唯一的requestCode
只需要给每个PendingIntent分配不同的requestCode,确保系统能区分它们就行,比如在alarmno的基础上加上不同的后缀:
修改你的PendingIntent创建代码如下:
// 主通知的PendingIntent,保留原alarmno作为requestCode Intent alarmIntent = new Intent(this, lockscreenactivity.class); alarmIntent.putExtra("alarmno", alarmno); alarmIntent.putExtra("snooze", false); alarmIntent.putExtra("dismiss", false); PendingIntent pendingIntent = PendingIntent.getActivity(this, alarmno, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); // Snooze按钮的PendingIntent,用alarmno + 2作为唯一标识 Intent snoozeintnet = new Intent(this, lockscreenactivity.class); snoozeintnet.putExtra("alarmno", alarmno); snoozeintnet.putExtra("snooze", true); snoozeintnet.putExtra("dismiss", false); PendingIntent pendingsnooze = PendingIntent.getActivity(this, alarmno + 2, snoozeintnet, PendingIntent.FLAG_UPDATE_CURRENT); // Dismiss按钮的PendingIntent,用alarmno + 1作为唯一标识 Intent dismissintent = new Intent(this, lockscreenactivity.class); dismissintent.putExtra("alarmno", alarmno); dismissintent.putExtra("dismiss", true); dismissintent.putExtra("snooze", false); PendingIntent pendingdismiss = PendingIntent.getActivity(this, alarmno + 1, dismissintent, PendingIntent.FLAG_UPDATE_CURRENT);
额外小提示
你的自定义通知根布局notiflay设置了android:clickable="true",这个其实可以不用,因为setOnClickPendingIntent已经会自动处理该布局的点击事件,不过保留它也不会影响功能,看你个人习惯就行。
修改后再测试一下,应该就能正常工作了:点击通知主体会触发预设的主Intent,点击Dismiss按钮执行取消逻辑,点击Snooze按钮执行贪睡逻辑。
内容的提问来源于stack exchange,提问作者alex barnes
相关产品推荐
相关产品推荐

