Doze 模式如何影响后台服务和通知的推送?
解读
国内面试官问“Doze 模式如何影响后台服务和通知的推送”,核心想确认三件事:
- 你是否真的在 6.0+ 机器上踩过电量优化的坑,而不是只背文档;
- 能否把“系统省电”与“业务保活”之间的博弈讲清楚,尤其在国产手机深度定制 ROM 里 Doze 被二次加码的现实;
- 能否给出可落地的灰度方案,而不是一句“用 FCM”就结束——FCM 在国内并不可用。
因此,回答必须围绕“系统行为 → 限制细节 → 国内差异 → 业务补偿策略”四层展开,让面试官听到你“既懂原理,也懂国情”。
知识点
-
Doze 模式状态机
- IDLE → IDLE_MAINTENANCE → IDLE…,系统聚合闹钟、网络、JobScheduler、SyncAdapter、FGS 窗口。
- 进入条件:灭屏 + 静止 + 电池供电,国产 ROM 30 min~1 h 即可进入;原生 AOSP 需 1 h+。
-
后台服务限制
- 普通 Service 在 Doze 下被直接禁止启动(startService 抛 IllegalStateException);
- 前台服务(startForegroundService)仅在“Doze 白名单”或“临时窗口”内存活,且必须 5 s 内出通知;
- 国产 ROM(MIUI、ColorOS、EMUI)把“后台启动”权限单独抽离,用户手动关闭后,即使白名单也拉不起。
-
通知推送通道
- FCM:高优先级消息(priority=high)可短暂拉起应用网络与 CPU 窗口,但国内被 GMS 缺失与厂商省电代理双重掐断;
- 厂商推送:华为 Push、小米 Push、OPPO Push 等自带系统级保活,消息经系统通道直达,不受 Doze IDLE 限制;
- 自建长连接:Doze 下网络被冻结,Socket 存活但发不出包;必须在 MAINTENANCE 窗口或高优先级 FCM 通道里重连。
-
国内常用“保活”手段与风险
- 白名单引导:跳转到系统“电池优化”页面申请 IGNORE_BATTERY_OPTIMIZATIONS,华为/小米仍需二次弹窗用户确认;
- 前台服务+常驻通知:合规做法,但 Android 13 开始必须立即挂出通知,否则系统崩溃;
- WorkManager 加急任务(setExpedited):在 Doze 下仅保证 10 min 内执行一次,适合拉活而不是实时推送;
- 双进程守护、JobScheduler 拉活、1 像素 Activity 等灰色方案,上架应用商店会被扫描拒绝。
-
合规灰度方案
- 推送通道降级:优先走厂商通道,FCM 仅作海外兜底;
- 业务分级:IM 高优消息用厂商“透传+点击通知”方式,低优营销消息直接丢弃到下次 MAINTENANCE;
- 数据驱动:通过 Battery Historian 观察 Doze 占比,针对 Doze 占比>40% 且消息到达率<90% 的机型,动态弹窗引导加白名单。
答案
Doze 模式是 Android 6.0 引入的系统性省电策略,在灭屏、静止、电池供电三条件同时满足后,设备会进入 IDLE 状态。此时系统通过“冻结网络、推迟闹钟、限制服务启动”三把锁,把后台活动压缩到 10 min 一次的 MAINTENANCE 窗口。
具体影响如下:
- 后台服务:普通 Service 无法通过 startService 启动,会直接抛 IllegalStateException;前台服务虽可启动,但必须在 5 s 内调用 startForeground 并弹出通知,否则应用崩溃;国产 ROM 还会额外检查“后台弹出界面”权限,拒绝后仍无法启动。
- 通知推送:海外依赖 FCM 高优先级消息,可在 Doze 下获得 10 s 网络与 CPU 窗口,但国内 GMS 缺失,高优消息被厂商代理层丢弃;因此国内应用必须接入华为 Push、小米 Push 等厂商通道,这些通道在系统层持有签名级白名单,能直接唤醒目标进程并弹出通知,不受 Doze 限制。
- 自建长连接:Doze 冻结网络,Socket 虽保持但无法收发数据,必须在 MAINTENANCE 窗口或厂商推送触发后批量重连;否则只能等用户主动点亮屏幕退出 Doze。
- 业务补偿:上架国内商店的应用,应在首次启动引导用户把自身加入“电池优化”白名单(REQUEST_IGNORE_BATTERY_OPTIMIZATIONS),同时利用 WorkManager 的 setExpedited 任务在 MAINTENANCE 窗口内完成轻量拉活;对于实时性要求极高的 IM 场景,必须全量接入厂商通道,并把消息优先级拆成“高-低”两档,高优走厂商透传,低优直接丢弃到下次窗口,确保整体耗电指标通过绿色联盟检测。
一句话总结:Doze 模式把后台服务与网络全部锁死,国内唯一可行路径是“厂商推送通道+白名单引导+业务分级”,任何试图绕过系统限制的灰色保活手段,在合规上架与长期运维上都不可持续。
拓展思考
- Android 12 引入的“受限待机状态(Restricted Standby)”在 Doze 基础上再砍一刀:每小时仅允许 10 min 网络,且不允许前台服务常驻;针对这一变化,如何设计“可降级”的 IM 体验,例如把实时语音切换为离线留言?
- 折叠屏与大屏设备常在桌面支架模式下长时间灭屏但处于“静止+充电”状态,此时系统绕开 Doze,但厂商可能自定义“深度睡眠”策略;如何通过 DeviceState 与 Charging 事件动态关闭自建长连接,把电量损耗降到 1% 以下?
- 国内车载 ROM(如 AliOS、鸿蒙车机)把 Doze 白名单与车规级签名绑定,普通三方 SDK 无法申请;若高德/网易云音乐需要在车机后台持续下载离线地图或音乐,该用何种系统级 API 申请“车载任务调度”权限,而非传统 FGS?