Android 6.0的省电技术Doze作用影响以及避免方法
2017-04-12 14:56
393 查看
从android 6.0开始,谷歌引入了两项新的省电技术延长电池使用时间,分别是Doze(休眠)和App Standby(app待命模式),只要app是运行在6.0(api 23)及以上的系统,无论app编译时是否使用的target=23,都会受到这两种技术的限制。
理解什么是Doze模式
如果设备满足
1、屏幕关闭;
2、没有连接电源,
这样持续一段时间后系统就会进入Doze模式,在Doze模式下,系统通过限制app访问网络和其对CPU使用来达到省电的目的,app的网络访问功能会被禁用,同时延时执行作业,异步任务及标准闹钟事件。
同时,为了保证app的工作,系统会周期地退出Doze模式,以保证app完成那些被延时的任务,如下图,这个状态被称作maintenance window(维护窗口)。且随着系统处于Doze模式时间增长,进入maintenance window的频率会降低。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/24d2aecddb7e68a44b83d419e2bc967d)
Doze 模式下的限制
1、网络访问功能被关闭
2、系统会忽略wake locks,即app无法持续占有电源
3、标准闹钟 AlarmManager(包括setExact()和setWindow())都会被延时到下一个maintenance window才激活
3.1 . 如果app仍需要在Doze时使闹钟生效,可以使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()
3.2 . 使用函数setAlarmClock()设置的闹钟在Doze时仍会生效,系统会在闹钟生效前推出Doze。
4、系统不会进行Wi-Fi扫描
5、系统不允许异步Adapters运行
6、系统不允许JobScheduler运行
应用避免被省电优化解决方法
当然,应用有特殊需求才会这样做,没有必要的情况下不要这样做,毕竟维护安卓良好生态,依靠你我他。
解决方法:设置应用为白名单
1、判断应用是否已经为白名单
2、否的话,则提示用户开启
可以在onActivityResult方法对结果进行处理
记得加上权限
效果图如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/0626a0573f88f324def96c9b9b6deb83)
在Doze时测试APP
1 . 需要一台系统版本大于等于6.0(api23)的设备
2 . 连接USB,运行被测app,保持app在活动状态
3 . 关闭设备屏幕
4 . 通过下面的adb命令强制系统进入Doze模式
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
第二个命令需要执行多次才能使系统进入idle状态
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/70f8627fade83cbc3c6bc242e974247d)
毕。
理解什么是Doze模式
如果设备满足
1、屏幕关闭;
2、没有连接电源,
这样持续一段时间后系统就会进入Doze模式,在Doze模式下,系统通过限制app访问网络和其对CPU使用来达到省电的目的,app的网络访问功能会被禁用,同时延时执行作业,异步任务及标准闹钟事件。
同时,为了保证app的工作,系统会周期地退出Doze模式,以保证app完成那些被延时的任务,如下图,这个状态被称作maintenance window(维护窗口)。且随着系统处于Doze模式时间增长,进入maintenance window的频率会降低。
Doze 模式下的限制
1、网络访问功能被关闭
2、系统会忽略wake locks,即app无法持续占有电源
3、标准闹钟 AlarmManager(包括setExact()和setWindow())都会被延时到下一个maintenance window才激活
3.1 . 如果app仍需要在Doze时使闹钟生效,可以使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()
3.2 . 使用函数setAlarmClock()设置的闹钟在Doze时仍会生效,系统会在闹钟生效前推出Doze。
4、系统不会进行Wi-Fi扫描
5、系统不允许异步Adapters运行
6、系统不允许JobScheduler运行
应用避免被省电优化解决方法
当然,应用有特殊需求才会这样做,没有必要的情况下不要这样做,毕竟维护安卓良好生态,依靠你我他。
解决方法:设置应用为白名单
1、判断应用是否已经为白名单
private boolean isIgnoringBatteryOptimizations(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String packageName = getPackageName(); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); return pm.isIgnoringBatteryOptimizations(packageName); } return false; }
2、否的话,则提示用户开启
private final static int REQUEST_IGNORE_BATTERY_CODE = 1001; private void gotoSettingIgnoringBatteryOptimizations() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { try { Intent intent = new Intent(); String packageName = getPackageName(); intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + packageName)); startActivityForResult(intent, REQUEST_IGNORE_BATTERY_CODE); } catch (Exception e) { e.printStackTrace(); } } }
可以在onActivityResult方法对结果进行处理
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_OK){ if (requestCode == REQUEST_IGNORE_BATTERY_CODE) { Log.d("Hello World!","开启省电模式成功"); } }else if (resultCode == RESULT_CANCELED) { if (requestCode == REQUEST_IGNORE_BATTERY_CODE) { Toast.makeText(this, "请用户开启忽略电池优化~", Toast.LENGTH_LONG).show(); } } }
记得加上权限
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> <!-- 白名单对话框权限 -->
效果图如下
在Doze时测试APP
1 . 需要一台系统版本大于等于6.0(api23)的设备
2 . 连接USB,运行被测app,保持app在活动状态
3 . 关闭设备屏幕
4 . 通过下面的adb命令强制系统进入Doze模式
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
第二个命令需要执行多次才能使系统进入idle状态
毕。
相关文章推荐
- Android 6.0的省电技术Doze作用影响以及避免方法
- Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
- Android中SAX,DOM解析XML中 各方法触发时机,以及参数作用
- Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
- Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
- Android中图片压缩技术以及图片缓存避免OOM
- Android拍照存储文件报open failed: ENOENT (No such file or directory)(适配不同手机的方法)以及6.0动态权限
- android事件传递机制,以及ondispatchEvent()、onInterceptTouchEvent()和OnTouchEvent()三个方法的作用关系
- Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索——2.4 滤镜以及配套代码的制作方法
- Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
- [Android] 安卓开启WIFI热点代码 以及6.0开启热点报错/异常解决方法
- Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
- Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
- Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
- Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
- 根据反射技术得到jar包中所有类,以及方法
- android 屏幕截图并缩小 以及存取方法
- 函数对象的意义:泛型算法应用以及避免重载带来的全局影响
- Android中AVD的使用以及错误处理方法