第1章 PowerManager 核心职责

1.1 系统电源管理中枢

Android PowerManager 是整个系统的电源控制核心,负责协调 CPU、屏幕、网络、传感器等硬件的能耗状态。它通过统一的接口向应用层和系统服务提供“唤醒”、“休眠”、“锁屏”、“电量统计”等能力。没有 PowerManager,Android 设备将无法在应用退出后自动进入低功耗模式,电池会迅速耗尽。

PowerManager 的主要职责包括:

  • WakeLock 管理 — 控制 CPU/屏幕/键盘灯是否保持唤醒。
  • 省电模式调度 — 根据电池电量、用户场景动态调整功耗策略。
  • Doze / Standby 状态机 — 在设备空闲时深度限制后台活动。
  • 电量统计与异常检测 — 收集各应用耗电数据,触发警告或杀进程。
  • 屏幕亮度与超时策略 — 管理自动亮度、息屏时间等。

1.2 WakeLock 机制

WakeLock 是一种“临时唤醒锁”,应用通过获取 WakeLock 来阻止系统进入深度休眠。它主要分为四类:

类型 作用对象 是否点亮屏幕 典型场景
PARTIAL_WAKE_LOCK CPU 否 后台下载、音乐播放
SCREEN_DIM_WAKE_LOCK CPU + 屏幕(变暗) 是(暗屏) 视频播放不操作时
SCREEN_BRIGHT_WAKE_LOCK CPU + 屏幕(亮) 是(全亮) 导航、游戏
FULL_WAKE_LOCK CPU + 屏幕 + 键盘灯 是(全亮) 键盘输入、拍照取景
💡 提示: 从 Android 9 起,应用在后台获取 WakeLock 时必须先获得 android.permission.WAKE_LOCK 权限,且部分类型(如 FULL_WAKE_LOCK)已被废弃,建议使用 PowerManager.WakeLock + 超时机制。

1.3 省电优先级层级

系统根据应用类型和当前状态,将省电策略划分为三个优先级层级。层级越高,系统越优先保证其资源,减少节电干预。

层级 典型应用 系统干预程度 对 WakeLock 的影响
高优先级(前台可见) 正在使用的应用、通话、导航 几乎不干预 WakeLock 完全生效
中优先级(感知后台) 音乐播放器、运动追踪、下载服务 有限制:禁止频繁唤醒 WakeLock 可获取,但强制超时
低优先级(纯后台) 社交推送、云同步、统计上报 严格限制:延迟执行、禁止持锁 WakeLock 可能被忽略或转换为定时唤醒
⚠️ 常见误区: 许多人认为只要获取了 WakeLock 就能保证 CPU 持续工作。实际上,在 Doze 模式下(设备静止且屏幕关闭较久),所有后台应用的 WakeLock 都会被改为“一次性定时唤醒”,实际持锁时间不超过几十秒。要长期后台运行,必须使用 JobScheduler 或 ForegroundService,而非单纯依赖 WakeLock。

1.4 原理图解:WakeLock 生命周期与省电层级

WakeLock 生命周期与省电优先级层级 应用请求 WakeLock PowerManager 决策 高优先级 前台可见应用 中优先级 感知后台服务 低优先级 纯后台应用 ✅ 正常持锁 CPU/屏幕保持唤醒 超时限制宽松 ⚠️ 受限持锁 可获取但强制超时 禁止频繁唤醒 🚫 严格限制 WakeLock 被忽略 转为定时唤醒 系统干扰强度:低 <–––––––––––––––––> 高

1.5 应用边界与最佳实践

  • 必须成对获取/释放 — 每个 acquire() 必须对应一个 release(),否则会导致“持锁不释放”的功耗灾难。
  • 避免长时间持锁 — 建议使用 acquire(long timeout) 设定超时,即使忘记释放,系统也会自动回收。
  • 区分后台场景 — 如果是播放音乐、导航等持续后台任务,应使用 ForegroundService 携带通知,而不是单靠 WakeLock。
  • 响应省电模式 — 在 ACTION_POWER_SAVE_MODE_CHANGED 广播中减少后台活动,避免被系统强制杀进程。
📌 关键结论: PowerManager 是 Android 电源管家的“大脑”,WakeLock 是它颁给应用的“临时通行证”,而省电优先级层级则决定了这张通行证的实际效力。理解这三者的关系,是设计省电应用的第一课。

1.6 练习题(思考巩固)

  1. 若应用在后台获取了 PARTIAL_WAKE_LOCK,手机进入 Doze 模式后该锁是否仍然有效?为什么?
  2. 为什么 Google 不建议使用 SCREEN_DIM_WAKE_LOCK 和 FULL_WAKE_LOCK?推荐用什么替代方案?
  3. 省电优先级层级中,“中优先级”的应用若长时间不释放 WakeLock,系统会采取什么措施?