一键设置双不同时间闹钟存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
相关产品推荐
相关产品推荐

