我正在开发一个应用程序,它使用AlarmManager在后台生成一些服务。时序对我们的应用程序非常重要,功能无法等待下一个维护窗口发生。 要求用户将应用程序列入白名单不是问题,但不能解决暂停警报的问题。电池消耗也不是一个大问题。
我想到的第一个可能的解决方案是生成一个始终运行的前台服务来处理服务的重新安排而不是AlarmManager,但这样做会改变我们应用程序的大部分基础结构,对我们来说是不可行的。 / p>
我刚刚实施的当前修复是发送高优先级推送通知并在接收消息时,采取完全唤醒锁定并打开屏幕以打破打盹模式。
我想知道是否有另一种打破打盹模式的方法?也可以不用唤醒锁?实施上述解决方案会产生一些可能的后果吗?
P.S。我使用UrbanAirship进行推送通知。
答案 0 :(得分:6)
您无法“中断”/停止/禁用打盹模式,但有些方法可以在设备推土时暂时解除应用程序的限制。
FCM高优先级消息可让您可靠地唤醒您的应用以访问网络,即使用户的设备处于打盹或应用处于应用待机模式。在Doze或App Standby模式下,系统会传递消息并使应用程序临时访问网络服务和部分唤醒锁,然后将设备或应用程序返回到空闲状态。
高优先级FCM消息不会影响打盹模式,并且它们不会影响任何其他应用程序的状态。这意味着您的应用可以使用它们进行有效通信,同时最大限度地减少系统和设备对电池的影响。
andAllowWhileIdle
闹钟。Doze特别可能影响AlarmManager警报和计时器管理的活动,因为当系统处于Doze时,Android 5.1(API级别22)或更低级别的警报不会触发。
为了帮助安排警报,Android 6.0(API级别23)引入了两个新的AlarmManager方法:setAndAllowWhileIdle()和setExactAndAllowWhileIdle()。使用这些方法,您可以设置即使设备处于打盹状态也会触发的警报。
请注意,打盹模式下两个警报之间的最小间隔为9分钟。
对于这两种情况,您的应用程序将在短时间内恢复为完整功能(意味着:打盹限制不适用),当该时间到期时,操作系统将恢复打盹限制。
请注意,在这些“唤醒”期间,您无需打开屏幕即可执行代码。
我手头没有消息来源,但我相信我说的短暂时间是~10秒。