Android 6.0的省电技术Doze作用影响以及避免方法

从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的频率会降低。



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、判断应用是否已经为白名单

[java]  view plain  copy
  1. private boolean isIgnoringBatteryOptimizations(){  
  2.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
  3.             String packageName = getPackageName();  
  4.             PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);  
  5.             return pm.isIgnoringBatteryOptimizations(packageName);  
  6.         }  
  7.         return false;  
  8.     }  

2、否的话,则提示用户开启

[java]  view plain  copy
  1. private final static int REQUEST_IGNORE_BATTERY_CODE = 1001;  
  2.     private void gotoSettingIgnoringBatteryOptimizations() {  
  3.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
  4.             try {  
  5.                 Intent intent = new Intent();  
  6.                 String packageName = getPackageName();  
  7.                 intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);  
  8.                 intent.setData(Uri.parse("package:" + packageName));  
  9.                 startActivityForResult(intent, REQUEST_IGNORE_BATTERY_CODE);  
  10.             } catch (Exception e) {  
  11.                 e.printStackTrace();  
  12.             }  
  13.         }  
  14.     }  

可以在onActivityResult方法对结果进行处理

[java]  view plain  copy
  1. @Override  
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         super.onActivityResult(requestCode, resultCode, data);  
  4.         if(resultCode == RESULT_OK){  
  5.             if (requestCode == REQUEST_IGNORE_BATTERY_CODE) {  
  6.                 Log.d("Hello World!","开启省电模式成功");  
  7.             }  
  8.         }else if (resultCode == RESULT_CANCELED) {  
  9.             if (requestCode == REQUEST_IGNORE_BATTERY_CODE) {  
  10.                 Toast.makeText(this"请用户开启忽略电池优化~", Toast.LENGTH_LONG).show();  
  11.             }  
  12.         }  
  13.     }  


记得加上权限

[java]  view plain  copy
  1. <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> <!-- 白名单对话框权限 -->  


效果图如下



在Doze时测试APP

1 . 需要一台系统版本大于等于6.0(api23)的设备

2 . 连接USB,运行被测app,保持app在活动状态

3 . 关闭设备屏幕

4 . 通过下面的adb命令强制系统进入Doze模式

[java]  view plain  copy
  1. $ adb shell dumpsys battery unplug  
  2. $ adb shell dumpsys deviceidle step  

第二个命令需要执行多次才能使系统进入idle状态


毕。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值