Android Alarm Manager setExactAndAllowWhileIdle() 在 Android



我试图使用警报管理器的setExactAndAllowWhileIdle每 30 分钟在我的应用程序中发出警报,但它不起作用!

我通过在收到警报信号时发出推送通知来测试功能。

问题是:当设备在空闲一段时间后进入打瞌睡模式时,我不再收到警报。但是,一旦我打开屏幕,我就会收到通知。我的应用程序需要准确的警报,需要每 30 分钟准时发送一次!它无法承受延迟警报或掉落警报,因为设备处于打瞌睡模式!

我在代码中使用了以下内容:

  1. 我在打开应用程序时设置了闹钟。
  2. 我使用WakefulBroadcastReceiver接收警报信号。在其onReceive()方法我设置下一个闹钟。我也,开始一个 startWakeful服务,仅发出推送通知,然后停止 本身。
  3. 我在 onReceive() 的末尾调用 completeWakefulIntent
  4. 我尝试测试两者:RTC_WAKEUP和ELAPSED_REALTIME_WAKEUP

笔记:

  • wakefulbroadcastReceiver 类在清单中注册。
  • 我添加了以下权限:android.permission.WAKE_LOCK
  • 我尝试将我的应用列入白名单,但结果相同
  • 我尝试使用即使在打瞌睡时也能一直工作的setAlarmClock()模式,每 50 个警报有一个丢弃/延迟警报。所以,它也不是 完善。而且我不希望用户一直看到警报图标 那里。
  • setExactAndAllowWhileIdle() 不仅在打瞌睡期间不起作用,而且它 工作时的准确性很差。我通常会在 1-3 分钟后或 1-3 分钟前收到很多警报信号
  • 我正在使用华为Mate 8和android 7.0牛轧糖进行测试。

附言:在回答之前,请确保您了解启动Android 6.0 M和打瞌睡模式的限制。

链接1:https://developer.android.com/training/monitoring-device-state/doze-standby.html

总之,它是这样说的:

  • 如果您需要设置在低电耗模式下触发的闹钟,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
  • 使用 setAlarmClock() 设置的警报继续正常触发 — 系统在这些警报触发前不久退出低电模式。

现在,为什么我不使用setExactAndAllowWhileIdle()每 30 分钟获得一次准确的警报信号?! 而且,为什么setAlarmClock()不是100%可靠?!

您可能会收到准确的警报,但在打瞌睡模式下

系统将忽略唤醒锁。

因此,如果您真的需要每 30 分钟触发一次,似乎AlarmManager.setAlarmClock是唯一可接受的解决方案。这可能会抵消所有打瞌睡模式的节能效果......

顺便说一句:似乎您可以看到带有adb shell dumpsys alarm的警报.


可能性:使用 Firebase JobDispatcher

Firebase JobDispatcher 是一个用于在 Android 应用中调度后台作业的库。它提供了一个与JobScheduler兼容的API,适用于所有安装了Google Play服务的最新版本的Android(API级别14+)。

我遇到了和你一样的问题,并搜索了很长时间以寻找解决方案。但我没有找到通用的解决方案。

三星设备的解决方案可用: 关闭应用程序时,Android AlarmManager在某些设备上不起作用

第一个答案不起作用,但第二个答案:)

您是否尝试过将应用添加到电池优化白名单中?正如一些新闻指出的那样(链接),华为有一些特殊的电池管理。

如果您想在每次计时器触发时显示通知,则可以使用后端服务器向Android用户发送数据通知

您需要将 Android 客户端的 FCM 令牌保存在后端服务器中,服务器将负责向这些客户端推送通知。

我知道只显示通知有点复杂,但这就是 Android 系统的工作原理!

最新更新