Skip to content

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. 对应知识库文档 ​

7. 关键源码 ​

站点构建时间:2026/8/24 23:43:17