Android上RTC的了解,可以参见http://blog.csdn.net/crycheng/article/details/7802502,该文对RTC自下往上浅析,讲的较好,阐述了RTC的作用、RTC驱动层的基本结构、以及app层service层jni层对rtc的调用。
Alarm manager 相关代码位于
frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp
frameworks/base/services/java/com/android/server/AlarmManagerService.java
frameworks/base/core/java/android/app/AlarmManager.java
(1)com_android_server_AlarmManagerService.cpp,这部分代码直接管理硬件时钟,设备名为/dev/alarm。包括打开设备,关闭设备,设置时区,设置触发时间(timeout),以及等待时钟触发。
(2)AlarmManagerService.java,这部分封装目录中的代码,通过继承IAlarmManager.Stub向上提供aidl接口,供AlarmManager.java调用。
(3)AlarmManager.java,通过IAlarmManager.aidl和IAlarmManager mService,调用service中的函数。(4)Alarm超出了应用程序的作用域,所以它们可以用于触发应用程序事件或动作,甚至在应用程序关闭之后。与Broadcast Receiver结合,它们可以变得尤其的强大,可以通过设置Alarm来启动应用程序或者执行动作,而应用程序不需要打开或者处于活跃状态。举个例子,你可以使用Alarm来实现一个闹钟程序,执行正常的网络查询,或者在“非高峰”时间安排耗时或有代价的操作。
Alarm的操作通过AlarmManager来处理,通过getSystemService可以获得其系统服务,如下所示:AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
(5)这里有4种Alarm类型
a,RTC,在一个显式的时间触发Intent,但不唤醒设备。
c,ELAPSED_REALTIME,从设备启动后,如果流逝的时间达到总时间,那么触发Intent,但不唤醒设备。流逝的时间包括设备睡眠的任何时间。
d,ELAPSED_REALTIME_WAKEUP,从设备启动后,达到流逝的总时间后,如果需要将唤醒设备并触发Intent。
Alarm的创建过程演示如下片段所示:
int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;当Alarm到达时,你指定的PendingIntent将被触发。取消一个Alarm,调用AlarmManager的cancel方法,所示:alarms.cancel(pendingIntent);
long timeOrLengthofWait = 10000;
String ALARM_ACTION = “ALARM_ACTION”;
Intent intentToFire = new Intent(ALARM_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);
alarms.set(alarmType, timeOrLengthofWait, pendingIntent);
(6)用闹钟实现自动开关机,请参见:http://www.cnblogs.com/melaniedeng/archive/2012/02/16/2355066.html