也是偶然之间听到这个词的 Doze模式 Doze模式
Doze 翻译为打盹, 那么Android的Doze模式呢 , 就是让手机进入了类似打盹的一个状态 , 在这个半梦半醒的状态下 , 手机的后台、服务、广播等都会发生相应的延迟。
Doze模式在Android M(6.0)时引入,定义了一种新的低功耗状态。
1. Doze的状态
若判断用户在连续的一段时间内没有使用手机,就延缓终端中APP后台的CPU和网络活动,以达到减少电量消耗的目的。注意,这里只是延缓并没有杀死进程。
上一张图来解释一下这个状态吧(这张图是偷的)
横轴为时间轴,纵轴代表运行的状态,红色为活跃,绿色为休眠
从(0,0)点开始,我们可以看到一直是红色的运行状态,这时候手机的状态保持一段时间后就进入了Doze状态:
- Screen off 屏幕熄灭
- Stationary 手机静止 , 即不发生位移
- On Battery 使用电池供电
当处于上述三种状态一段时间后即进入了Doze模式,这时所有的活动都暂时被停止,只有在maintenance window时才会继续运行一小段时间随后又继续Doze , 这个maintenance window就是Doze模式中让系统继续运行的一个状态 , 这个状态自动定时进入.
这样, 手机就可以在保留了活动的情况下,达到了省电的目的.
一旦不满足上述的三种条件时,立即退出Doze模式
Doze模式中发生了什么
Doze并没有杀死进程
1、暂停网络访问。
2、系统忽略所有的WakeLock。
3、标准的AlarmManager alarms被延缓到下一个maintenance window。
但使用AlarmManager的 setAndAllowWhileIdle、setExactAndAllowWhileIdle和setAlarmClock时,alarms定义事件仍会启动。
在这些alarms启动前,系统会短暂地退出Doze模式。
4、系统不再进行WiFi扫描。
5、系统不允许sync adapters运行。
6、系统不允许JobScheduler运行
逃脱Doze模式
Android6.0及更高版本还提供了Doze模式白名单列表,通过设置应用程序进入白名单列表, 引导用户设置白名单, 可逃脱Doze模式的各种限制。
- 检测应用程序是否存在白名单list里面,可使用PowerManager的isIgnoringBatteryOptimizations()方法。
- 引导到电池优化界面,让用户去管理白名单
Intent i = new Intent();
i.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
startActivity(i);
在DeviceIdle中有三中类型的白名单列表:
- Doze模式下被限制的系统级App: mPowerSaveWhitelistAppsExceptIdle
- 所有模式下(Doze和app standby)被限制的系统级App mPowerSaveWhitelistApps
- 所有模式下被限制的用户级App: mPowerSaveWhitelistUserApps