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

一键设置双不同时间闹钟存SQLite,第二个闹钟无通知问题求助

问题分析与修复方案

你的第二个闹钟无法正常触发,核心是两个关键逻辑错误导致的,下面逐一拆解并给出修复方案:

1. PendingIntent 被重复覆盖

在ReminderAlarmService.getReminderPendingIntent()方法里,你给PendingIntent.getService()传的请求码是固定的0。当创建第二个闹钟的PendingIntent时,系统会因为请求码相同,直接复用第一个闹钟的PendingIntent实例,导致第二个闹钟的触发逻辑完全被覆盖,自然无法响应。

修复方法:用每个闹钟的唯一ID作为请求码。因为插入数据库后返回的Uri包含了唯一的记录ID,我们可以从中提取这个ID来区分不同的PendingIntent:

public static PendingIntent getReminderPendingIntent(Context context, Uri uri) {
    Intent action = new Intent(context, ReminderAlarmService.class);
    action.setData(uri);
    
    // 从Uri中提取唯一ID作为请求码
    long alarmId = ContentUris.parseId(uri);
    // Android 12+建议添加FLAG_IMMUTABLE保证兼容性
    return PendingIntent.getService(context, (int) alarmId, action, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}

2. Calendar 月份被重复递减

在第一个闹钟的代码中,你执行了calendar.set(Calendar.MONTH, --mMonth);——这里直接修改了mMonth变量的值(减1)。当创建第二个闹钟时,又执行了一次--mMonth,导致第二个闹钟的月份变成了原mMonth - 2,如果这个时间是过去的,AlarmManager会直接忽略这个闹钟请求。

修复方法:不要直接修改原mMonth变量,而是用临时计算值来设置月份:

// 第一个闹钟的Calendar设置
calendar.set(Calendar.MONTH, mMonth - 1); // 仅计算,不修改原mMonth
calendar.set(Calendar.YEAR, mYear);
calendar.set(Calendar.DAY_OF_MONTH, mDay);
calendar.set(Calendar.HOUR_OF_DAY, mHour1);
calendar.set(Calendar.MINUTE, mMinute1);
calendar.set(Calendar.SECOND, 0);
long selectedTimestamp = calendar.getTimeInMillis();
// ... 插入数据库和设置闹钟的代码

// 第二个闹钟的Calendar设置
calendar.set(Calendar.MONTH, mMonth - 1); // 再次使用原mMonth的计算值
calendar.set(Calendar.YEAR, mYear);
calendar.set(Calendar.DAY_OF_MONTH, mDay);
calendar.set(Calendar.HOUR_OF_DAY, mHour2);
calendar.set(Calendar.MINUTE, mMinute2);
calendar.set(Calendar.SECOND, 0);
long selectedTimestamp2 = calendar.getTimeInMillis();
// ... 插入数据库和设置闹钟的代码

3. 额外优化:通知被覆盖的问题

你的通知ID是固定的NOTIFICATION_ID = 1,第二个闹钟触发时会直接覆盖第一个的通知。可以同样用闹钟的唯一ID作为通知ID,让两个通知同时显示:

// 在ReminderAlarmService.onHandleIntent()中
long alarmId = ContentUris.parseId(uri);
notificationManager.notify((int) alarmId, builder.build());

总结

按照上述修改,你需要:

  • 给每个PendingIntent分配唯一的请求码
  • 避免重复修改月份变量导致时间错误
  • (可选)给每个通知分配唯一ID

完成这些调整后,第二个闹钟就能正常触发并显示通知了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:57:55