> 文档中心 > Android系统中闹钟服务-AlarmManagerService的分析

Android系统中闹钟服务-AlarmManagerService的分析


简介:

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了。