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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值