21

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

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

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

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

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

笔记:

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

PS: 在回答之前,请确保您了解从 Android 6.0 M 和打盹模式开始施加的限制。

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

总而言之,它说:

  • 如果您需要设置在打瞌睡时触发的警报,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
  • 使用 setAlarmClock() 设置的警报继续正常触发——系统在这些警报触发前不久退出打盹。

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

4

4 回答 4

3

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

系统忽略唤醒锁。

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

顺便说一句:您似乎可以使用adb shell dumpsys alarm.


可能性:使用Firebase JobDispatcher

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

于 2017-11-07T10:42:21.823 回答
0

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

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

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

于 2021-01-25T06:38:42.030 回答
0

我遇到了和你一样的问题,找了很久才解决。但我没有找到一个通用的解决方案。

适用于三星设备的解决方案: 当应用程序关闭时,Android AlarmManager not working on some devices

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

于 2017-07-20T16:34:42.047 回答
0

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

于 2018-08-10T11:52:21.797 回答