Android 警报管理器 setExactAndAllowWhileIdle() 在打盹模式下的 Android 7.0 Nougat 中不起作用
Posted
技术标签:
【中文标题】Android 警报管理器 setExactAndAllowWhileIdle() 在打盹模式下的 Android 7.0 Nougat 中不起作用【英文标题】:Android Alarm Manager setExactAndAllowWhileIdle() not working in Android 7.0 Nougat in Doze mode 【发布时间】:2017-12-18 03:47:18 【问题描述】:我尝试使用警报管理器的setExactAndAllowWhileIdle
每 30 分钟在我的应用中触发一次警报,但它不起作用!
我通过在收到警报信号时发出推送通知来测试功能。
问题是:当设备闲置一段时间后进入打盹模式时,我不再收到警报。但是,只要我打开屏幕,我就会收到通知。我的应用需要准确的警报,需要每 30 分钟准确准时发送!它不能因为设备处于打盹模式而接收延迟警报或丢失警报!
我在代码中使用了以下内容:
-
我在打开应用程序时设置了闹钟。
我使用 WakefulBroadcastReceiver 接收警报信号。在其
onReceive()
方法我设置了下一个闹钟。我也,开始一个
startWakefulService 仅发出推送通知,然后停止
本身。
我在 onReceive() 结束时调用了 completeWakefulIntent。
我尝试同时测试:RTC_WAKEUP 和 ELAPSED_REALTIME_WAKEUP
注意事项:
wakefulbroadcastReceiver 类已在 Manifest 中注册。 我添加了以下权限:android.permission.WAKE_LOCK
我尝试将我的应用列入白名单,但结果相同
我尝试使用setAlarmClock()
,即使在打瞌睡时也一直有效
模式,每 50 个警报有一个丢弃/延迟警报。所以,也不是
完美的。而且我不希望用户一直看到警报图标
在那里。
setExactAndAllowWhileIdle() 不仅在打瞌睡时不起作用,而且它
工作时的准确性很差。我通常会收到很多警报信号
1-3 分钟后或 1-3 分钟前。
我正在使用华为 Mate 8 和 android 7.0 Nougat 进行测试。
附注: 在回答之前,请确保您了解从 Android 6.0 M 和打盹模式开始施加的限制。
链接1:https://developer.android.com/training/monitoring-device-state/doze-standby.html
总而言之,它是这样说的:
如果您需要设置在打瞌睡时触发的警报,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。 使用 setAlarmClock() 设置的警报继续正常触发 — 系统在警报触发前不久退出打盹。现在,我为什么不使用setExactAndAllowWhileIdle()
每 30 分钟获得一次准确的警报信号?!
还有,为什么setAlarmClock()
不是 100% 可靠的?!
【问题讨论】:
可能help 我遇到了同样的问题,并且看到了类似的观察结果。我希望 Google 的某个人能够站出来解决这个问题。 @Mena 你找到解决方案了吗,我也有同样的问题。 @caucukien 仍然没有解决方案.... @Mena 你找到解决办法了吗? 【参考方案1】:您可能会收到准确的警报,但in Doze mode
系统忽略唤醒锁。
因此,如果您真的需要每 30 分钟触发一次,似乎 AlarmManager.setAlarmClock
是唯一可接受的解决方案。这可能会否定所有打瞌睡模式的节能...
顺便说一句:您似乎可以通过adb shell dumpsys alarm
看到警报。
可能性:使用Firebase JobDispatcher
Firebase JobDispatcher 是一个用于在您的 Android 应用中调度后台作业的库。它提供了一个兼容 JobScheduler 的 API,适用于安装了 Google Play 服务的所有最新版本的 Android(API 级别 14+)。
【讨论】:
是的,我一直在使用 adb shell 将设备设置为打瞌睡并监控警报,但是通过密集测试,平均准确度为 49/50,有 1 个丢弃/延迟警报.... . 我会应付一直可见的警报图标,但放弃警报是灾难性的。我不知道人们是否注意到了这样的问题,或者只是我的设备表现得很奇怪。 你考虑过使用Firebase JobScheduler吗?它使用 Google play 并被认为是准时的。 不,我没有。但是它不是建立在 JobScheduler 之上的,而 AlarmManager 是它的一部分吗? 它实现了相同的接口。据说它允许用户准确地安排警报,因为谷歌可以阻止邪恶的东西。见github.com/firebase/firebase-jobdispatcher-android/issues/187。【参考方案2】:我遇到了和你一样的问题,找了很久才解决。但我没有找到一个通用的解决方案。
提供适用于三星设备的解决方案: Android AlarmManager not working on some devices when the app is closed
第一个答案无效,但第二个答案:)
【讨论】:
【参考方案3】:您是否尝试过将您的应用添加到电池优化白名单?正如一些新闻指出的(link),华为有一些特殊的电池管理。
【讨论】:
【参考方案4】:如果您想在每次计时器触发时显示通知,则可以使用后端服务器向 Android 用户发送数据通知。
您需要将 Android 客户端的 FCM 令牌保存在后端服务器中,服务器将负责向这些客户端推送通知。
我知道只显示通知有点复杂,但Android系统就是这样工作的!
【讨论】:
以上是关于Android 警报管理器 setExactAndAllowWhileIdle() 在打盹模式下的 Android 7.0 Nougat 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
MainActivity 中的 Android 类没有收到来自警报管理器的广播
Android 警报管理器 setExactAndAllowWhileIdle() 在打盹模式下的 Android 7.0 Nougat 中不起作用