3. Doze模式的触发条件:设备静止、屏幕关闭、未充电
聊到Doze模式,很多人第一反应就是「省电」。没错,但你知道它什么时候开始工作吗?
我经常在培训时问学员:手机放桌上不动、屏幕黑了、也没插充电线,这时候系统在干嘛?答案就是——Doze模式正在悄悄启动。
触发条件其实就三个:设备静止、屏幕关闭、未充电。缺一不可。咱们一个一个拆开看。
3.1 设备静止:不是不动,是几乎不动
系统怎么判断设备静止?靠的是加速度传感器。说白了,就是手机里的那个小芯片,能感知到你在晃它。
我记得有一次,一个同事把手机放在振动台上做测试,结果Doze死活不触发。后来发现,加速度计一直在报数据,系统认为设备在动。嗯,这其实是个坑。
系统判断静止的逻辑是这样的:
- 加速度计连续上报数据
- 如果一段时间内变化量小于阈值,就认为静止
- 这个阈值由硬件和驱动共同决定
你可能会问:多久才算「一段时间」?
答案是:默认是30分钟。但不同厂商可能会改。我见过某款平板改成了15分钟,结果用户抱怨推送延迟。所以这个值不是随便调的。
核心要点:设备静止不是「绝对不动」,而是「相对静止」。系统通过加速度计数据判断,阈值和时长都可以配置。
3.2 屏幕关闭:最直观的条件
屏幕关闭这个条件,其实没什么好说的。亮屏状态下,Doze不会触发。为什么?因为你在用手机,系统不能限制你的网络和后台任务。
但这里有个细节:屏幕关闭不等于Doze立即启动。它只是必要条件之一。系统还要等设备静止、没充电,才会进入Doze。
我建议你记住这个顺序:
- 屏幕关闭 → 系统开始计时
- 设备静止 → 系统准备进入Doze
- 未充电 → 系统确认可以进入Doze
你看,屏幕关闭是第一步,但不是全部。
3.3 未充电:电源管理的底线
这个条件很有意思。为什么充电时不触发Doze?
原因很简单:充电时,省电不是首要目标。你插着电源,系统没必要限制后台任务。相反,它应该利用这个机会完成同步、更新等操作。
我曾经遇到一个案例:某款手机充电时推送特别慢。查了半天,发现是Doze在充电时也被触发了。后来定位到是驱动层的一个bug,把充电状态误判为未充电。修完之后,推送恢复正常。
注意:充电状态检测依赖电源管理芯片和驱动。如果驱动上报错误,Doze的行为就会异常。调试时一定要先确认充电状态是否准确。
3.4 三个条件的逻辑关系
这三个条件不是「或」的关系,而是「与」的关系。也就是说,必须同时满足,Doze才会触发。
我画了一张图,帮你理解这个逻辑:
从图上可以看得很清楚:三个条件缺一不可。任何一个不满足,Doze都不会触发。
3.5 实际项目中的避坑指南
做Doze调试时,我踩过不少坑。这里分享几个:
避坑1:我曾经遇到一个情况,手机放桌上不动,屏幕也关了,但Doze就是不触发。后来发现是加速度计的采样频率被改低了,导致系统误判设备在动。解决办法是检查驱动层的采样配置。
避坑2:充电状态检测有时会出问题。比如USB线接触不良,系统会频繁切换充电/未充电状态。这时候Doze会反复进入和退出,导致功耗反而更高。我建议在调试时先确认充电状态是否稳定。
避坑3:有些厂商会修改静止判断的时长。如果你发现Doze触发太慢或太快,先看看系统属性device_idle.inactivity_timeout的值。默认是30分钟,但可以改。
3.6 小结
触发条件就三个:设备静止、屏幕关闭、未充电。记住它们是「与」的关系就行。
我个人习惯在调试时先确认这三个条件是否都满足。用dumpsys deviceidle命令可以查看当前状态,非常方便。
嗯,下一节我们会聊Doze模式的具体状态机,看看进入Doze后系统到底做了什么。不过那是后话了。
一句话总结:Doze触发条件 = 静止 + 息屏 + 未充电。三个条件同时满足,系统才会进入省电模式。
公众号:蓝海资料掘金营,微信deep3321