简介:
AlarmManagerService是Android系统框架层的一个服务,提供闹钟相关的功能。和其它许多服务一样,它也是通过Binder IPC机制为Client(可以看作是Android应用层序)提供服务的。
AlarmManagerService源码分析:
架构图:
代码位置:
frameworks/base/core/java/android/app/AlarmManager.java
frameworks/base/core/java/android/app/IAlarmManager.aidl
frameworks/base/services/java/com/android/server/alarm/AlarmManagerService.java
分析:
1)AlarmManager:作为Client端,可以被App调用;它拥有一个继承自IAlarmManger接口的远程实例;通过这个远程实例,最终与AlarmManagerService进行通信;
2)AlarmThread:是AlarmManager的一个内部类用于协助AlarmManager实现相关功能;
3)IAlarmManager:这其实是一个aidl文件。通过aidl工具编译成java文件,只有这样,才能再被java编译成字节码文件(.class); 编译成的java文件中,包含下面三个接口或类:
IAlarmManager接口,Stub类,和代理类Proxy。
Stub是IAlarmManager的一个内部类,Proxy是Stub的内部类;通过它们,就能够将Client和Server(AlarmManagerService)使用进程间通信机制Binder进行通信了。
来看一下
frameworks/base/core/java/android/app/IAlarmManager.aidl
的定义:
package android.app;
import android.app.PendingIntent;
/**
* System private API for talking with the alarm manager service.
*
* {@hide}
*/
interface IAlarmManager {
void set(int type, long triggerAtTime, in PendingIntent operation);
void setRepeating(int type, long triggerAtTime, long interval, in PendingIntent operation);
void setInexactRepeating(int type, long triggerAtTime, long interval, in PendingIntent operation);
void setTime(long millis);
void setTimeZone(String zone);
void remove(in PendingIntent operation);
}
看起来,是不是很简单,那是因为背后的实现逻辑都有Android系统做了,我们无需关心具体的实现细节(其实就是用aidl工具将这个aidl文件编译成java文件了。)
AlarmManagerService的初始化:
AlarmManagerService的初始化工作是在SystemServer的内部类ServerThread中完成的:
frameworks/base/services/java/com/android/server/SystemServer.java中,
alarm = new AlarmManagerService(context);
ServiceManager.addService(Context.ALARM_SERVICE, alarm);
创建AlarmManagerService后,将其放入到ServiceManager,由ServiceManager管理起来,以后就可以通过
ServiceManager.getService(name)
来获取到这个Service了。