来自Optimizing for Doze and App Standby:
Doze特别容易影响AlarmManager的活动 警报和计时器管理,因为Android 5.1中的警报(API级别22) 系统处于打盹时,或者不要点火。
为了帮助安排警报,Android 6.0(API级别23)介绍了 两个新的AlarmManager方法:setAndAllowWhileIdle()和 setExactAndAllowWhileIdle()。使用这些方法,您可以设置警报 即使设备处于打盹状态,它也会触发。
那么,如果我需要在Android 5.1的Doze中准确设置闹钟,我该怎么办?这不可能吗?
这是我的代码
if (noPreciseTime) {
alarmManager.set(AlarmManager.RTC_WAKEUP, now + interval, pendingIntent)
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent)
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent)
} else {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pendingIntent)
}
答案 0 :(得分:3)
那么,如果我需要在确切的时间设置闹钟,即使在Android 5.1中的Doze期间,该怎么办?
运行5.1的设备不打瞌睡,因此您无需担心。此
alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent)
将在5.1中按预期工作。引入了较新的setExactAndAllowWhileIdle,以便在运行6.0+的设备上使用。你的代码片段没问题。
当系统处于Doze 时,Android 5.1(API级别22)或更低级别的警报不会触发
这是一个令人困惑的声明。他们在这里要说的是警报使用5.1或更低版本的API设置(如setExact)在设备处于打盹时不会触发。
答案 1 :(得分:0)
在我的实验中,AlarmManagerCompat + setAlarmClock稳定可在打ze模式下唤醒。我使用的是使用MIUI的小米设备。
AlarmManagerCompat.setAlarmClock(alarmManager, time, showIntent, pendingIntent)