我试图使用Alarm Manager的setExactAndAllowWhileIdle
每隔30分钟在我的应用程序中发出警报,但它无效!
每当收到报警信号时,我都会通过发出推送通知来测试功能。
问题是:当设备闲置一段时间后进入打盹模式时,我不再收到警报。但是,只要我打开屏幕,我就会收到通知。我的应用程序需要准确的警报,需要每30分钟准确按时交付!由于设备处于打盹模式,它无法接收延迟警报或丢失警报!
我在我的代码中使用了以下内容:
onReceive()
方法中,我设置下一个警报。我也是,启动一个只发出推送通知的startWakefulService,然后自行停止。笔记:
android.permission.WAKE_LOCK
添加了权限setAlarmClock()
,它甚至在打盹模式下一直工作,每50个警报就有一个掉线/延迟报警。所以,它也不完美。而且我不希望用户一直看到警报图标。P.S:在回答之前,请确保您了解从Android 6.0 M和Doze模式开始施加的限制。
Link1:https://developer.android.com/training/monitoring-device-state/doze-standby.html
总之它说:
现在,为什么我不能使用setExactAndAllowWhileIdle()
每30分钟获得准确的报警信号?!而且,为什么setAlarmClock()
100%可靠?!
你可能得到准确的警报,但in Doze mode
系统忽略唤醒锁定。
因此,如果你真的需要每30分钟触发一次,那么AlarmManager.setAlarmClock
似乎是唯一可接受的解决方案。这可能会否定所有打瞌睡模式的节能......
顺便说一句:好像你可以看到adb shell dumpsys alarm
的警报。
可能性:使用Firebase JobDispatcher
Firebase JobDispatcher是一个用于在Android应用中安排后台作业的库。它提供了与JobScheduler兼容的API,适用于安装了Google Play服务的所有最新版本的Android(API级别14+)。
我遇到了和你一样的问题,并且长时间搜索解决方案。但我找不到一般解决方案。
可以使用三星设备的解决方案:Android AlarmManager not working on some devices when the app is closed
第一个答案不起作用,但第二个答案:)
您是否尝试将应用添加到电池优化白名单?正如一些消息所指出的那样(华为),华为有一些特殊的电池管理。