Android在6.0推出了 Doze 和 App standby模式,这个其实是大家早就关注的问题,Google推出只是早晚的问题,
原因如下:
1.手机电池越来越大,电量越来越多,但是手机电池越来越不经用,
2.Android的手机应用过多过杂,根本没有办法管理,应用的功能乱用,严重消耗了不必要的电量
3.IOS其实一直是这个机制的,虽然实现略有区别,但是IOS的效果还是很好的。
基于以上原因,Google重要在 6.0版本根据自己的情况推出了两种模式来省电了,可见Android 6.0在电量方面肯定会有较大提升的,尤其是在待机的时候。
再来介绍一下这两个是什么,
首先Doze 和 App standby虽然Google是放在一起提出来的,但是这是两个不同的东西
Doze:是针对系统而言的,可以理解为一种模式。当手机在某种条件下会进入该模式,并且会触发一些特性,并且在某种条件下退出该模式。
首先介绍一下何种条件会触发(&&)基本上所有都程序员都是到&&的意思吧,就是说下面的条件必须豆瓣出,才会触发进入该模式
再来看一下触发哪些特性:
看到了吧,这个橙色的部分就是系统提供的让各个应用执行特定任务的时间,随着手机进入Doze模式的时间加上,间隔时间会越来越长。
到这里你可能觉得我讲的也太笼统了,这你三个到底是什么啊,那好,下面我就来具体一下,看看应用的哪些行为会收到限制
下面介绍何种条件会退出(||)||的含义不需要我多说啦吧,不懂的我也就建议你不要在程序界混了
到这里Doze模式就介绍完了,下面介绍一下App standby模式
App Standby:这个概念则是针对于应用的,当App进入AppStandby状态后,也会受到网络等状态的限制
老套路,继续介绍进入条件和退出条件吧,至于其他的和Doze 模式的某些条件是相同的,
进入条件
- 当用户不触摸使用应用程序一段时间时,该应用程序处于AppStandby状态,系统将把该App标志为空闲状态
退出条件
- 用户主动启动该App
- 该App当前有一个前台进程(或包含一个活动的前台服务,或被另一个activity或前台service使用)
- App生成一个用户所能在锁屏或通知托盘看到的Notification
- 而当用户设备插入电源时,系统将会释放App的待机状态,允许他们自由的连接网络及其执行未完成的工作和同步。如果设备空闲很长一段时间,系统将允许空闲App一天一次访问网络。
总结
最后在总结一下Doze模式与App Standby模式的区别- Doze模式需要屏幕关闭(通常晚上睡觉或长时间屏幕关闭才会进入)
- App Standby不需要屏幕关闭,App进入后台一段时间也会受到连接网络等限制。
那么我们应用可以i 做什么呢?
1.实时通信可以采用GCM,
2.除了GCM,Android6.0及更高版本还提供了Doze模式白名单列表,通过设置应用程序进入白名单列表可逃脱Doze模式的network和partial wake locks。
至于第一个这个肯定会收到影响的,但是这个解决方案,对于大陆来说,还是没有什么鸟用的,那么我们重点看一下第二种吧,
第二种有两种方法:
第一个是App程序可发送action为ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS的intent引导用户进入设置界面将应用程序设置进白名单列表里。
第二个就是使用AREQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限来触发一个系统对话来让用户添加到白名单里,而无需进入设置界面去设置。
首先来介绍第一种(终于可以上代码了,文字真心不是我的强项啊):
Intent ignore = new Intent();
ignore.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
this.startActivity(ignore);
就这么简单,看看启动的页面吧
在这个页面中目前显示的是为优化的应用,就是在白名单中的应用,我们可以选择所有应用,然后点进去,将我们应用设置成不优化就加入白名单了
第二种方法就简单的多啦
首先在AndroidManifest中加入以下权限
<android:uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
然后在需要加入白名单的地方加入如下代码:
Intent ignore = new Intent();
ignore.setData(Uri.parse("package:"+this.getPackageName()));
ignore.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
this.startActivity(ignore);
然后就会弹出
然后点击是就会把我嗯自己的应用加入白名单了。这种方式很简单吧,
最后介绍一下如何测试我们的应用在Doze模式和App Standby模式时能否正常工作吧。
- Android 6.0的设备
- 安装应用
- 运行应用,保持活跃
- 关闭屏幕
- adb shell dumpsys battery unplug
- $ adb shell dumpsys deviceidle step
- 输入第二条命令直到设备状态返回Idle,此时设备进入Doze模式
- $ adb shell dumpsys battery unplug
- $ adb shell am set-inactive <packageName>true
- 此时应用进入App Standby模式