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

问题描述 投票:15回答:3

我试图使用Alarm Manager的setExactAndAllowWhileIdle每隔30分钟在我的应用程序中发出警报,但它无效!

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

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

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

  1. 我在打开应用程序时设置闹钟。
  2. 我使用WakefulBroadcastReceiver接收警报信号。在它的onReceive()方法中,我设置下一个警报。我也是,启动一个只发出推送通知的startWakefulService,然后自行停止。
  3. 我在onReceive()的末尾调用completeWakefulIntent。
  4. 我尝试了两种方法:RTC_WAKEUP和ELAPSED_REALTIME_WAKEUP

笔记:

  • wakefulbroadcastReceiver类在Manifest中注册。
  • 我为:android.permission.WAKE_LOCK添加了权限
  • 我试过White-Listing我的应用程序,但结果是一样的
  • 我尝试使用setAlarmClock(),它甚至在打盹模式下一直工作,每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()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze。

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

android android-intent android-alarms android-7.0-nougat android-doze
3个回答
2
投票

你可能得到准确的警报,但in Doze mode

系统忽略唤醒锁定。

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

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


可能性:使用Firebase JobDispatcher

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


0
投票

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.