我正在尝试使用警报管理器每 30 分钟在我的应用程序中触发一次警报,setExactAndAllowWhileIdle
但它不起作用!
每当我收到警报信号时,我都会通过发布推送通知来测试功能。
问题是:当设备闲置一段时间后进入打盹模式时,我不再收到警报。但是,只要我打开屏幕,我就会收到通知。我的应用需要准确的警报,需要每 30 分钟准确准时发送!由于设备处于打盹模式,因此无法接收延迟警报或丢失警报!
我在我的代码中使用了以下内容:
- 当我打开我的应用程序时,我设置了闹钟。
- 我使用 WakefulBroadcastReceiver 接收警报信号。在它的
onReceive()
方法中,我设置了下一个闹钟。我还启动了一个 startWakefulService,它只发出推送通知,然后自行停止。 - 我在 onReceive() 结束时调用了 completeWakefulIntent。
- 我尝试同时测试:RTC_WAKEUP & ELAPSED_REALTIME_WAKEUP
笔记:
- wakefulbroadcastReceiver 类在 Manifest 中注册。
- 我添加了以下权限:
android.permission.WAKE_LOCK
- 我尝试将我的应用程序列入白名单,但结果相同
- 我尝试使用
setAlarmClock()
which 即使在打瞌睡模式下也一直有效,每 50 个警报有一个丢弃/延迟警报。所以,它也不完美。而且我不希望用户一直在那里看到警报图标。 - setExactAndAllowWhileIdle() 不仅在打瞌睡时不起作用,而且在工作时精度也很差。
我通常会在 1-3 分钟后或 1-3 分钟前收到很多警报信号。 - 我正在使用华为 Mate 8 和 android 7.0 Nougat 进行测试。
PS: 在回答之前,请确保您了解从 Android 6.0 M 和打盹模式开始施加的限制。
链接1:https ://developer.android.com/training/monitoring-device-state/doze-standby.html
总而言之,它说:
- 如果您需要设置在打瞌睡时触发的警报,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
- 使用 setAlarmClock() 设置的警报继续正常触发——系统在这些警报触发前不久退出打盹。
现在,为什么我不能每 30 分钟收到一次准确的警报信号setExactAndAllowWhileIdle()
?!而且,为什么不是setAlarmClock()
100% 可靠?!