我正在开发一个应用程序,它使用 AlarmManager 在后台生成一些服务。时机对于我们的应用程序非常重要,并且功能不能等待下一个维护窗口的发生。
要求用户将应用程序列入白名单不是问题,但不能解决暂停警报的问题。此外,电池消耗也不是一个大问题。
我想到的第一个可能的解决方案是生成一个始终运行的前台服务来处理服务的重新调度,而不是 AlarmManager,但这样做会改变我们应用程序的大部分基本结构,对我们来说是不可行的。
我刚刚实现的当前修复是发送高优先级推送通知,并在收到消息后,采取完全唤醒锁定并打开屏幕以打破打瞌睡模式。
我想知道是否有其他方法可以打破打瞌睡模式?也可以不使用唤醒锁吗?实施上述解决方案可能会产生一些影响吗?
附:我正在使用 UrbanAirship 进行推送通知。
您无法“打破”/停止/禁用打瞌睡模式,但有一些方法可以在设备打瞌睡时暂时解除应用程序的限制。
- 高优先级 FCM 消息。
FCM 高优先级消息可让您可靠地唤醒应用程序以访问网络,即使用户的设备处于打瞌睡状态或应用程序处于应用程序待机模式时也是如此。在打瞌睡或应用程序待机模式下,系统会传递消息并为应用程序提供对网络服务和部分唤醒锁的临时访问权限,然后将设备或应用程序返回到空闲状态。
高优先级 FCM 消息不会影响打瞌睡模式,也不会影响任何其他应用程序的状态。这意味着您的应用程序可以使用它们进行有效通信,同时最大限度地减少对系统和设备的电池影响。
- An
andAllowWhileIdle
使用 AlarmManager 设置警报。
打瞌睡特别有可能影响 AlarmManager 警报和计时器管理的活动,因为当系统处于打瞌睡状态时,Android 5.1(API 级别 22)或更低版本中的警报不会触发。
为了帮助安排闹钟,Android 6.0(API 级别 23)引入了两个新的 AlarmManager 方法:setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle()。通过这些方法,您可以设置即使设备处于打瞌睡状态也会触发的警报。
请注意,打瞌睡模式下两次警报之间的最小间隔为 9 分钟。
对于这两种情况,您的应用程序都会在短时间内恢复到完整功能(意味着:打瞌睡限制不适用),当该时间到期时,操作系统将恢复打瞌睡限制。
请注意,您不需要在这些“唤醒”期间打开屏幕来执行代码。
我手头没有消息来源,但我相信我所说的较短时间约为 10 秒。
来源及补充阅读 https://developer.android.com/training/monitoring-device-state/doze-standby.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)