我有很多麻烦的是让我的无线电闹钟按预期工作,我在这里阅读了很多有关该主题的线程,但是不幸的是,没有人确实对我有帮助。
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent penInt = PendingIntent.getBroadcast(this, intentId, intent, 0);
这种区分我在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);
}
根据log.d消息,我可以看到,在我的Android 7.1设备上,第一个方法setAlarmClock()
正在执行以在接收器中设置警报。
经过3周的测试和编码不成功,我变得非常绝望 - 根据DOZE模式培训页面,我的警报今天又不到4分钟了 - 这应该永远不会发生:
:用setalarmclock()设置的警报继续正常发射 - 这些警报射击前不久,系统退出。
在我的7.1手机上,当我将警报设置为"现在 5或6"分钟时,警报甚至迟到20秒至1:40。谁能建议我如何真正及时完美地发出警报?
尝试使用:
setExactAndAllowWhileIdle()
这将确保警报按时发射。我已经在自己的应用程序中对其进行了测试,并且很可靠。
如果您针对少于23的API,请将其保留在IF子句中,该子句检查设备中安装的当前API。仅在API级别23上使用它,用于使用setExact
进行休息。回答您的评论的权利:
1)我在打ze模式下精确测试了它,而没有电池插入
2)是的,不幸的是,在空闲类型警报时,每9分钟的限制有一个警报。您在这里有两个选择:
首先使用setExactandallowwhileidle发射第一个警报。
a)对于小睡,您将必须使用setalarmclock方法
b)对于小睡,您可以安排工作时间为最少的延迟时间作为小睡时间。这将确保工作至少安排在贪睡间隔的差距上。但是,这将导致工作在间隔之后随机安排,因此您还需要将覆盖截止日期设置为0,以便在最小延迟后立即安排工作。还要将网络要求保留为无,并且需要闲置模式为默认或false。这也与我的经验一样可靠,我个人使用这种方法。
文档指出:
-
如果您需要在打ze时设置发射警报,请使用 setandallowwhileidle()或setExactandallowhileidle()。
-
用setalarmclock()设置的警报继续正常发射 - 系统 这些警报发射前不久退出打ze。
在"适应您的应用程序打ze"部分中,它还说:
注意:setAndallowWhileIdle()也不是setExActandallowwhileIdle() 每9分钟,每9分钟都可以发射警报。
setExactandallowwhileidle的文档说:
与其他警报不同,系统可以自由重新安排此类 警报会与任何其他警报,甚至来自 同一应用。当设备闲置时,这显然会发生(因为 当闲置时,此警报可能会发出 将举行直到以后),但即使没有闲置也可能发生。 请注意,操作系统将使自己更加灵活地安排 这些警报比常规确切警报,因为该应用程序具有 选择了这种行为。当设备闲置时,甚至可能需要 为了优化电池寿命,更多的自由度。
因此,setExActandallowwhyrileIdle不能保证确切的执行,而setAlarmClock更精确(根据文档)。