首页 > 解决方案 > 打盹模式、电池优化白名单、AlarmManager 比 9 分钟更频繁

问题描述

我正在创建一个应用程序来连接 BT 设备以收集健康数据(即:体温)。

传感器会定期休眠并仅在有限的时间窗口内唤醒以进行连接。

我试图创建 AlarmManager 来触发前台服务,setExactAndAllowWhileIdle()并且它在超过 9 分钟的时间内按预期工作,

但在 9 分钟以下,它会进入打瞌睡模式,并且不会触发 AlarmManager BroadcastReceiver。

从文档中我不明白将应用程序添加到电池优化白名单是否会允许 AlarmManager 触发更多攻击 https://developer.android.com/training/monitoring-device-state/doze-standby#support_for_other_use_cases

例如,白名单应用的作业和同步被延迟(在 API 级别 23 及以下),并且其常规 AlarmManager 警报不会触发

什么是常规警报?是setExactAndAllowWhileIdle()正常的吗?

任何澄清将不胜感激

编辑:

我知道这setExactAndAllowWhileIdle()会在打瞌睡模式下触发事件超过 9 分钟,问题是将应用程序添加到白名单是否会允许它更频繁地触发

标签: androidalarmmanagerandroid-doze

解决方案


什么是常规警报?setExactAndAllowWhileIdle() 是常规的吗?

setExactAndAllowWhileIdle()不规则。常规警报可以是通过 setExact() 和 setWindow() 设置的 AlarmManager 警报。

但在 9 分钟以下,它会进入打瞌睡模式并且不会触发 AlarmManager BroadcastReceiver

它对设置警报的频率有限制。

根据文档

为了减少滥用,对特定应用程序的警报响起频率有限制。在正常的系统操作下,它不会超过大约每分钟发送这些警报(此时每个此类挂起的警报都会被发送);在低功耗空闲模式下,此持续时间可能会更长,例如 15 分钟。

您可以参考打瞌睡限制,其中说:

标准 AlarmManager 警报(包括 setExact() 和 setWindow())被推迟到下一个维护窗口。

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

对于白名单:

白名单中可用的应用程序部分免于打盹和应用程序待机优化。这并不意味着他们可以在打盹模式下完全访问并执行任务。列入白名单的应用可以在打盹和应用待机期间使用网络并保持部分唤醒锁。但是,其他限制,例如作业不同,标准警报触发仍然施加

注意:您应该检查可接受的用例以将应用列入白名单。

除非应用的核心功能受到不利影响,否则 Google Play 政策禁止应用请求直接免除 Android 6.0+(打盹和应用待机)中的电源管理功能。


推荐阅读