Appearance
alarmmanager-doze-demo
1. 实验目标
用最小 Android 实现验证 AlarmManager 精确定时与 Doze 模式限制(对应 docs/03-background-tasks/06 与 01):
setExact:普通精确闹钟,进入 Doze 后会被推迟到系统维护窗口setExactAndAllowWhileIdle:Doze 突破,深度休眠下仍按时触发(但系统限制每 9/15 分钟最多一次)- 结论:AlarmManager 适合"到点提醒"这类精确定时,不适合高频后台轮询(受 Doze / 厂商限制)
2. 工程要点
AlarmManagerDemoActivity:两个按钮分别设置普通闹钟与 AllowWhileIdle 闹钟(10 秒后触发)AlarmReceiver:Manifest 静态注册(exported=false),收到后通过包内广播回传给 Activity 日志区- 观察方式:模拟器执行
adb shell dumpsys deviceidle step deep进入深度 Doze 后对比两种闹钟
3. 运行方式
bash
cd labs/android/host
./gradlew installDebug设备/模拟器打开 Android Host → 打开 AlarmManager / Doze 实验室。
Doze 对比步骤:
bash
# 先进入 Doze 维护测试(模拟器)
adb shell dumpsys battery unplug
adb shell dumpsys deviceidle step deep # 重复执行直到状态 IDLE
# 此时再点按钮设置两种闹钟,观察触发时机差异
adb shell dumpsys battery reset # 恢复4. 预期现象
- 正常(非 Doze):两种闹钟都约 10 秒触发
- 深度 Doze 后:
setExact明显推迟(进入下一个维护窗口),setExactAndAllowWhileIdle基本准时
5. 常见误区
| 误区 | 实际情况 |
|---|---|
| AlarmManager 可以做稳定秒级轮询 | Doze + 厂商后台管理会延迟/合并触发,只适合低频到点提醒 |
setExactAndAllowWhileIdle 随便用 | 系统限制 Doze 下每 9/15 分钟最多一次,且需 SCHEDULE_EXACT_ALARM 权限(Android 12+) |
| 闹钟一定唤醒设备 | RTC 不唤醒,RTC_WAKEUP 才会唤醒(本 demo 用后者) |
6. 对应知识库文档
- 理论主文档:Doze 深度休眠模式与国内厂商后台限制
- AlarmManager 对比:WorkManager / ForegroundService / AlarmManager 对比