Kernel层
/dev/rtc
/dev/alarm
ioctl(fd, ANDROID_ALARM_SET(type), &ts)
ioctl(fd, ANDROID_ALARM_WAIT)
timerfd
没有RTC Alarm时,使用timerfd实现。
Java层
core/app
源代码位于:frameworks/base/core/java/android/app。
实现文件:AlarmManager.java。
services/alarm
类对应关系:
| java | jni | C++ |
| AlarmManagerService | AlarmImpl |
-
jni
源代码位于:frameworks/base/services/jni。
实现文件:com_android_server_AlarmManagerService.cpp。
-
java
源代码位于:frameworks/base/services/java/android/server。
实现文件:AlarmManagerService.java。
AlarmManagerService的辅助类:
Alarm——定时器,可以重复。
Batch——将允许延迟并且有交集的定时器打包一起。
AlarmThread——循环等待RTC Alarm,分派回调(PendingIntent)
AlarmHandler——内部消息循环,当Kernel不支持Alarm时,使用消息定时机制模拟实现。
InFlight——记录正在运行的回调,用于统计WakeLock的实际使用者。
ClockReceiver——注册1分钟和每天超时的定时器,回调Intent发送广播,广播类型:ACTION_TIME_TICK、ACTION_DATE_CHANGED。
ResultReceiver——处理回调完成的通知。
UninstallReceiver——处理应用停止(用户主动停止)、重启、卸载。
本文深入剖析Android系统的AlarmManager,从Kernel的/dev/rtc和/dev/alarm到Java层的实现,包括timerfd的使用、AlarmManagerService的辅助类如Alarm、Batch、AlarmThread等,以及BroadcastReceiver ClockReceiver的角色。详细阐述了AlarmManager在不同层次的工作原理和交互机制。

934

被折叠的 条评论
为什么被折叠?



