通常,AlarmManager重复闹钟停止工作的原因是因为在设定闹钟时,PendingIntent未使用FLAG_CANCEL_CURRENT或FLAG_UPDATE_CURRENT标志。这会导致新的闹钟覆盖旧的闹钟,而旧的闹钟不会被触发。在设定重复闹钟时,应使用FLAG_CANCEL_CURRENT或FLAG_UPDATE_CURRENT标志以确保新闹钟覆盖旧闹钟。
以下是一个使用FLAG_UPDATE_CURRENT标志的示例,以确保每次更新PendingIntent:
Intent intent = new Intent(this, MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
如果仍然无法解决问题,可以尝试使用setExactAndAllowWhileIdle()方法替换setRepeating()方法,以确保精度和兼容性。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}