Ben*_*Ben 4 android sleep alarmmanager setalarmclock doze
我很难使无线电闹钟按预期工作,并且在这里我已经阅读了很多有关该主题的主题,但是很遗憾,没有一个主题对我有帮助。
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent penInt = PendingIntent.getBroadcast(this, intentId, intent, 0);
Run Code Online (Sandbox Code Playgroud)
我在stackoverflow上找到的API级别之间的这种区分方法,将其放入我的calcNextAlarm()函数中(加上一些调试日志消息),无论设备上使用什么API,都可以正确设置警报:
// problems in doze mode api 23+
if (Build.VERSION.SDK_INT >= 23) {
if (testMode) Log.d("Ben", "setAlarmClock() - API 23+");
am.setAlarmClock(new AlarmManager.AlarmClockInfo(alarmTimeInMillis, penInt), penInt);
}
else if (Build.VERSION.SDK_INT >= 19) {
// Wakes up the device in Idle Mode
if (testMode) Log.d("Ben", "setExact() - API >= 19 && API < 23");
am.setExact(AlarmManager.RTC_WAKEUP, alarmTimeInMillis, penInt);
}
// Old APIs
else {
if (testMode) Log.d("Ben", "set() - API < 19");
am.set(AlarmManager.RTC_WAKEUP, alarmTimeInMillis, penInt);
}
Run Code Online (Sandbox Code Playgroud)
根据Log.d消息,我可以看到,在我的Android 7.1设备上,setAlarmClock()正在执行第一种方法来在Receiver中设置警报。
经过3个星期的测试和编码失败,我感到非常绝望-根据打ze模式培训页面,我的警报今天又响了4分钟-永远不会发生:
使用setAlarmClock()设置的警报继续正常触发-在这些警报触发之前,系统立即退出Doze。
在我的7.1手机上,当我将闹钟设置为“现在+5或6”分钟时,闹钟甚至会延迟20秒到1:40分钟。谁能告诉我如何真正始终正确地发出警报?
尝试使用:
setExactAndAllowWhileIdle()
Run Code Online (Sandbox Code Playgroud)
这将确保警报按时触发。我已经在自己的应用程序中对其进行了测试,并且它是可靠的。
如果您的目标API小于23,请将其保留在if子句中,该子句检查设备中安装的当前api。仅在API级别23以上使用此功能,其余的请继续使用setExact
有权回答您的评论:
1)我已经在打ze模式下准确测试了它,而没有插入电池
2)是的,不幸的是,闲置型警报每9分钟限制一个警报。您有两种选择:
首先使用setExactAndAllowWhileIdle触发第一个警报。
a)对于贪睡,您将必须使用setAlarmClock方法
b)对于贪睡,您可以安排JobScheduler作业,并将最小等待时间设置为贪睡时间。这将确保至少在暂停间隔的间隔内安排作业。但这只会导致在间隔之后随机调度作业,因此您还需要将替代截止时间设置为0,以便在最小延迟后立即调度作业。还应将网络要求设置为无,将空闲模式设置为默认或false。根据我的经验,这也和警报精确方法一样可靠,我本人也使用这种方法。