如何解决Alarm Manager循环设置Sqlite多组定时时间无通知问题?
问题分析与快速修复
嘿,我立刻就发现了问题所在——你循环设置多个闹钟时,所有PendingIntent都使用了相同的requestCode(也就是代码里的0),这会导致新创建的PendingIntent直接覆盖掉之前的,最终只有最后一个闹钟能正常触发,前面的全被“挤掉”了!
为啥单个闹钟没问题?
单个闹钟时,只有一个PendingIntent,没有冲突,所以系统能正确识别并触发它。但多个闹钟共用同一个requestCode的话,系统会认为这是同一个闹钟的更新操作,而不是新建多个独立的闹钟。
修复代码(核心改动:给每个PendingIntent分配唯一的requestCode)
把循环变量i作为requestCode传入PendingIntent.getBroadcast(),这样每个闹钟对应的PendingIntent都是独一无二的,不会互相覆盖。另外我还加了个小细节:如果设置的时间已经过了当天,自动把日期加一天,避免闹钟立刻触发:
// listOfTime是从Sqlite读取的定时时间列表 for (int i = 0; i < listOfTime.size(); i++) { int hour = Integer.parseInt(listOfTime.get(i).toString().substring(0, 2)); int minute = Integer.parseInt(listOfTime.get(i).toString().substring(3)); System.out.print("Hour : " + hour + " Minute : " + minute); Log.d("MyActivity", "Alarm On"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minute); // 处理当天时间已过的情况,自动延后到第二天 if (calendar.getTimeInMillis() < System.currentTimeMillis()) { calendar.add(Calendar.DAY_OF_YEAR, 1); } Intent myIntent = new Intent(ListRemainder.this, AlarmReceiver.class); // 用循环变量i作为唯一的requestCode,确保每个PendingIntent不重复 pendingIntent = PendingIntent.getBroadcast(ListRemainder.this, i, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent); }
额外提醒
- 关于
PendingIntent.FLAG_UPDATE_CURRENT:这个flag的作用是如果后续需要更新某个闹钟的Intent内容,能正确更新它,同时在requestCode唯一的前提下,不会干扰其他闹钟。 - 如果你之后需要取消某个特定闹钟,一定要用对应的
requestCode获取相同的PendingIntent,再调用alarmManager.cancel(pendingIntent),不然取消操作会无效。
内容的提问来源于stack exchange,提问作者Lutaaya Huzaifah Idris
相关产品推荐
相关产品推荐

