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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:03:43