第3章 Doze 模式第一阶段:灭屏后轻休眠、窗口冻结、网络暂停

核心概念解释

Doze 模式并非一步到位进入深度休眠,而是分为两个阶段。第一阶段称为轻休眠(Light Doze),发生在设备灭屏并静止一段时间后(通常是30分钟至1小时)。该阶段的核心机制是:

  • 窗口冻结:系统将前台可见 Activity 以外的所有应用窗口(即后台应用的界面状态)冻结,不再调度其 onDraw、动画等耗时操作,但进程仍保留在内存中。
  • 网络暂停:除高优先级网络唤醒锁(如 FCM 高优先级消息)外,所有应用的网络访问被延迟或合并,避免频繁唤醒调制解调器。
  • 保留核心功能:闹钟、电话、短信等系统级广播仍可正常触发;AlarmManager 的 setExactAndAllowWhileIdle 唯一允许每 9 分钟唤醒一次。

轻休眠不会杀进程,也不强制停止后台服务,只是通过调度限制来显著降低功耗。当用户拿起设备、点亮屏幕或连接充电器时,设备即刻退出轻休眠。

原理图解

Doze 第一阶段 — 轻休眠流程 灭屏 + 静止 30min 进入轻休眠 窗口冻结 (停止后台UI更新) 网络暂停 (延缓除高优外的请求) 保留核心功能 (闹钟/短信/电话) 退出轻休眠 亮屏 / 移动 / 充电 注:轻休眠不杀进程,不强制停止Service; 到达指定时间(约9分钟)会进入深度休眠第二阶段。

类比说明

想象一间大型图书馆在晚上闭馆前30分钟的阶段:

  • 窗口冻结 → 图书馆关闭所有阅览室的灯光,不再允许读者进入,但保留了座位和书籍。
  • 网络暂停 → 关闭大部分对外网络连接,仅保留紧急通道(如消防警铃、广播系统)。
  • 保留核心功能 → 值班室电话依然畅通,紧急疏散系统正常运作。
  • 一旦有读者按门铃(亮屏)、有人移动(移动检测)或管理员将电源插上(充电),图书馆立即恢复正常运行。

轻休眠就像是这个“闭馆预备期”——能耗降低但不彻底切断,用户随时能迅速恢复全功能。

常见误区辨析

误区辨析
轻休眠会把应用杀死 错。轻休眠只冻结窗口和限制网络,进程保留在后台缓存;应用代码并未退出,只是执行被暂停。
所有网络请求都被延迟 错。FCM 高优先级消息(最高级别推送)和系统级网络仍可穿透;普通第三方推送需配合高优先级唤醒锁。
轻休眠一进入就无法退出 错。用户只需点亮屏幕或拿起设备(加速度计检测到移动)即可即时退出,甚至不用解锁。
轻休眠阶段会强制停止后台Service 错。Service 的 onStartCommand 不会被调用,但 Service 进程仍存在;Android 8.0+ 的后台执行限制与轻休眠独立,不要混淆。

练习题

  1. 选择题:以下哪种事件可以立即将设备从轻休眠状态唤醒?
    A. 第三方应用发送普通广播
    B. 用户按下电源键点亮屏幕
    C. 系统闹钟触发(使用 setExactAndAllowWhileIdle)
    D. 设备在静止桌面忽然被移动
    提示: 除了亮屏、移动、充电外,系统闹钟也可唤醒,但属于受限唤醒——设备会短暂退出轻休眠,完成对闹钟的响应后重新进入轻休眠。
  2. 判断题:轻休眠阶段会拒绝所有来自互联网的 TCP 连接。
  3. 填空题:窗口冻结只会影响 ______(填“前台”或“后台”)Activity的界面更新。

应用边界

  • 适用场景:任何 Android 6.0+ 设备,灭屏且静止超过一定时间(通常是30分钟至1小时,不同厂商定制可能有差异)。
  • 不适用场景:
    • 设备正在通话(无论屏幕状态)
    • 设备正在投屏(如 Miracast)
    • 设备正在充电(即使灭屏静止,Doze 不会进入,但 App Standby 仍可能生效)
    • 用户通过 Settings.System.ADB_ENABLE 手动关闭 Doze(仅限测试用)
  • 与深度休眠的区别:轻休眠每小时网络窗口约1次;深度休眠后网络窗口被压缩到每9分钟最多一次,且 App Standby 桶限制更严格。轻休眠只是“预备阶段”,深度休眠才是完全冻结。

开发建议:如果应用需要在灭屏后仍然保持实时网络(如音乐播放、导航),请申请前台服务 + 相应的 wake lock,但注意前台服务通知必须可见;否则系统可能在一段时间后将应用“降级”到轻休眠受限状态。

// 不推荐在轻休眠期间使用普通网络请求
// 正确:使用 FCM 高优先级消息唤醒
// 或使用前台服务并始终显示通知