Android Alarm Manager setExactAndAllowWhileIdle()在Doze模式下无法在Android 7.0 Nougat中运行

时间:2017-07-13 11:27:47

标签: android android-intent android-alarms android-7.0-nougat android-doze

我正在尝试使用闹钟管理器self.tableView.reloadData() 每30分钟在我的应用中发出警报但是它无效!

每当收到警报信号时,我都会通过发出推送通知来测试功能。

问题是:当设备闲置一段时间后进入打盹模式时,我不再收到警报。但是,只要我打开屏幕,我就会收到通知。我的应用程序需要准确的警报,需要每30分钟准确按时交付!由于设备处于打盹模式,它无法接收延迟警报或丢失警报!

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

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

    • wakefulbroadcastReceiver类已在Manifest中注册。
    • 我添加了onReceive()
    • 的权限
    • 我尝试了White-Listing我的应用程序,但结果是相同的
    • 我尝试使用android.permission.WAKE_LOCK,即使在打瞌睡期间也一直有效 模式,每50个警报一个丢弃/延迟警报。所以,它也不是 完善。而且我不希望用户一直看到警报图标 那里。
    • 在打盹期间,setExactAndAllowWhileIdle()不仅不起作用,而且它也不起作用 在工作时具有可怕的准确性。我经常收到很多报警信号 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()设置的警报继续正常启动 - 系统在这些警报触发前不久就会退出打盹。

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

4 个答案:

答案 0 :(得分:2)

您可能会获得准确的警报,但in Doze mode

  

系统忽略唤醒锁定。

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

顺便说一句:好像你可以看到adb shell dumpsys alarm的警报。

可能性:使用Firebase JobDispatcher

  

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

答案 1 :(得分:0)

我遇到了和你一样的问题,并且长时间搜索解决方案。但我找不到一般解决方案。

可以使用三星设备的解决方案: Android AlarmManager not working on some devices when the app is closed

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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