打盹模式处理

Posted

技术标签:

【中文标题】打盹模式处理【英文标题】:Doze mode handling 【发布时间】:2017-05-20 00:17:59 【问题描述】:

我正在开发一个使用 AlarmManager 在后台生成一些服务的应用程序。时间对我们的应用程序非常重要,功能不能等待下一个维护窗口的出现。 要求用户将应用程序列入白名单不是问题,但不能解决暂停警报的问题。此外,电池消耗也不是什么大问题。

我想到的第一个可能的解决方案是生成一个始终运行的前台服务来处理服务的重新调度,而不是 AlarmManager,但这样做会改变我们应用程序的大部分基础结构,对我们来说是不可行的。

我刚刚实施的当前修复是发送高优先级推送通知,并在接收到消息时,采取完全唤醒锁定并打开屏幕以打破瞌睡模式。

我想知道是否有另一种打瞌睡模式的方法?也可以不使用唤醒锁吗?实施上述解决方案会产生一些可能的影响吗?

附:我正在使用 UrbanAirship 进行推送通知。

【问题讨论】:

不带唤醒锁也有可能吗?有什么可能? 在不打开屏幕的情况下接收高优先级推送通知是否可以打瞌睡?我正在考虑不在托盘中显示通知,但没有它,打开屏幕会更奇怪。 我试图用 FCM 消息解决类似的问题。但它会在很短的时间内唤醒我的应用程序。你有好的解决方案吗? ***.com/questions/44079858/… 我在这里也有类似的问题,如果你能提出任何建议,那会很有帮助。谢谢。 【参考方案1】:

您不能“中断”/停止/禁用打瞌睡模式,但有一些方法可以在设备打瞌睡时暂时解除应用的限制。

    高优先级 FCM 消息。

FCM 高优先级消息让您可以可靠地唤醒您的应用以访问网络,即使用户的设备处于打盹或应用处于应用待机模式。在 Doze 或 App Standby 模式下,系统传递消息并让应用临时访问网络服务和部分唤醒锁,然后将设备或应用返回到空闲状态。

高优先级 FCM 消息不会影响打盹模式,也不会影响任何其他应用的状态。这意味着您的应用可以使用它们进行高效通信,同时最大限度地减少对系统和设备的电池影响。

    使用 AlarmManager 设置 andAllowWhileIdle 警报。

打盹特别有可能影响 AlarmManager 警报和计时器管理的活动,因为 android 5.1(API 级别 22)或更低版本中的警报不会在系统处于打瞌睡状态时触发。

为了帮助安排闹钟,Android 6.0(API 级别 23)引入了两个新的 AlarmManager 方法:setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle()。使用这些方法,您可以设置即使设备处于打瞌睡状态也会触发的警报。

请注意,打瞌睡模式下两次闹钟之间的最小间隔为 9 分钟。


对于这两种情况,您的应用会在短时间内恢复完整功能(意味着:打盹限制不适用),当该时间到期时,操作系统将恢复打盹限制。

请注意,在这些“唤醒”期间,您无需打开屏幕即可执行代码。

我手头没有消息来源,但我相信我所说的短时间约为 10 秒。

Source & additional reading

【讨论】:

嗨蒂姆,我有一个类似的问题,如果你有时间,请看一下。这对我真的很有帮助。 ***.com/questions/44079858/… 来自 setAndAllowWhileIdle 方法文档的来源:“当警报发出时,应用程序也将被添加到系统的临时白名单中大约 10 秒,以允许该应用程序获取进一步的唤醒锁以完成它的工作。”

以上是关于打盹模式处理的主要内容,如果未能解决你的问题,请参考以下文章

什么是处理“打盹”功能的好方法?

什么是打盹模式计时?

打盹模式 - 前台服务是不是继续运行?

Android 打盹模式 - 蓝牙

打盹模式停止了定位服务

Nexus 5 不会使用 ADB 进入打盹模式