我正在尝试使用Alarm Manager的
我通过在接收到闹钟信号时发出推送通知来测试功能。
问题是:当设备长时间空闲后进入待机模式时,我不再收到闹钟。 但是,一旦我打开屏幕,我就会收到通知。 我的应用程序需要精确的闹钟,需要准确地按时每30分钟传递! 它不能承受因设备处于待机模式而接收到延迟的闹钟或丢失的闹钟!
我在代码中使用了以下内容:
1.打开应用程序时设置闹钟。 2.使用WakefulBroadcastReceiver接收闹钟信号。 在其
注:
setExactAndAllowWhileIdle
每30分钟在我的应用程序中设置一个闹钟,但它不起作用!我通过在接收到闹钟信号时发出推送通知来测试功能。
问题是:当设备长时间空闲后进入待机模式时,我不再收到闹钟。 但是,一旦我打开屏幕,我就会收到通知。 我的应用程序需要精确的闹钟,需要准确地按时每30分钟传递! 它不能承受因设备处于待机模式而接收到延迟的闹钟或丢失的闹钟!
我在代码中使用了以下内容:
1.打开应用程序时设置闹钟。 2.使用WakefulBroadcastReceiver接收闹钟信号。 在其
onReceive()
方法中,我设置下一个闹钟。 我还启动了一个startWakefulService,仅发出推送通知,然后停止自身。
3.在onReceive()的结尾调用completeWakefulIntent。
4.我尝试测试RTC_WAKEUP和ELAPSED_REALTIME_WAKEUP。注:
- 在清单文件中注册了wakefulbroadcastReceiver类。
- 我添加了
android.permission.WAKE_LOCK
权限。 - 我试图将我的应用程序加入白名单,但结果仍然相同。
- 我尝试使用
setAlarmClock()
,它可以在doze模式下一直工作,但每50个闹钟会有一个被丢弃或延迟。因此,它也不是完美的解决方案。而且我不想让用户一直看到那里的闹钟图标。 - 不仅
setExactAndAllowWhileIdle()
在doze模式下无法工作,而且当它在工作时精度也很差。通常我会收到许多1-3分钟后或1-3分钟早于预期的闹钟信号。 - 我正在使用华为Mate 8和Android 7.0 Nougat进行测试。
P.S: 在回答之前,请确保您已了解Android 6.0 M及Doze模式所施加的限制。
Link1: https://developer.android.com/training/monitoring-device-state/doze-standby.html
总之,它的意思是:- 如果您需要在Doze模式下触发警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
- 使用setAlarmClock()设置的警报会继续正常触发 - 系统会在这些警报触发前不久退出Doze模式。