虽然Android的每个系统版本都在手机电量方面努力进行优化,不过一直没能解决后台服务泛滥、手机电量消耗过快的问题。于是在Androi6.0系统中,谷歌加入了一个全新的Doze模式。从而可以极大幅度地延长电池的使用寿命。本小节中我们就来了解一下这个模式,并且掌握一些编程时的注意事项。
首先看一下到底什么是Doze模式。当用户的设备是Android6.0或以上系统时,如果该设备未插接电元,处于禁止状态(Android7.0中删除了这一条),且屏幕关闭了一段时间之后,就会进入到Doze模式。在Doze模式下,系统会对CPU、网络、Alarm等活动进行限制,从而延长电池的使用寿命。
当然,系统并不会一直处于Doze模式,而是会间歇性退出Donze模式一段时间,在这段时间中,应用就可以去完成他们的同步操作、Alarm任务,等等。如下所示:
可以看到,随着设备进入Donze模式的时间延长,间歇性地退出Doze模式的事件间隔也会越长。因为如果设备长时间不适用的话,是没必要平法退出Doze模式来执行同步操作的,Android在这些细节上的把控使得电池寿命进一步得到延长。
接下来我们具体看一看在Doze模式下有哪些功能会受到限制吧。
1 网络访问被禁止
2 系统忽略唤醒CPU或者屏幕操作。
3 系统不再执行WIFI扫描。
4 系统不再执行同步服务
5 Alarm任务将会在下次退出Doze模式的时候执行
注意其中最后一条,也就是说,在Donze模式下,我们的Alarm任务将会变得不准时。当然,这在大多数情况下是合理的,因为只有当用户长时间不适用手机的时候才会进入Done模式,这在大多数情况下都是合理的,因此只有当用户长时间不使用手机的时候菜户进入Done模式,通常在这种情况下对Alarm任务的准时性要求并额米有那么高。
不过,如果你真的有非常特殊的要求,要求Alarm任务即使在Doze模式下也必须正常执行,Android还是提供了解决方案。调用AlarmManager的setAndllowWhileIdle()或者setExactAndllowWhileIdle()方法就能让任务即使在Done模式下也能正常执行了,这两个方法之间的区别和set()、setExact()方法之间的区别是一样的。