对应 AlarmManager 有一个 AlarmManagerServie 服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册的各类闹铃并适时的设置即将触发的闹铃给闹铃设备 ( 在系统中,Linux 实现的设备名为 ”/dev/alarm” ) ,并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie 服务程序就会遍历闹铃列表找到相应的注册闹铃并发出广播。该服务程序在系统启动时被系统服务程序 system_service 启动并初始化闹铃设备 ( /dev/alarm ) 。当然,在 JAVA 层的 AlarmManagerService 与 Linux Alarm 驱动程序接口之间还有一层封装,那就是 JNI。(参考官方文档:AlarmManager | Android Developers)
AlarmManager 将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而是直接通过 AlarmManager 来使用这种服务。这也许就是客户/服务模式的好处吧。AlarmManager 与 AlarmManagerServie 之间是通过 Binder 来通信的,他们之间是多对一的关系。
AlarmManager 提供了 8 个与之相关的方法:
AlarmManager Public Methods (方法) |
||||||||||||||||
void |
cancel(PendingIntent operation) 取消参数匹配的闹铃 |
|||||||||||||||
void |
set(int type, long triggerAtMillis, PendingIntent operation) 注册一个新的闹铃 |
|||||||||||||||
void |
setExact(int type, long triggerAtMillis, PendingIntent operation) 注册一个新的闹铃,这个闹铃将在指定的时间被准确的执行 |
|||||||||||||||
void |
setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) 注册一个对触发时间并不是很精准的闹铃,例如,一个闹铃每小时都会重复,但不一定都是在每个小时的最开始被触发 |
|||||||||||||||
void |
setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) 注册一个重复类型的闹铃 |
|||||||||||||||
void |
setTime(long millis) 设定系统时钟时间 |
|||||||||||||||
void |
setTimeZone(String timeZone) 设置系统默认时区 |
|||||||||||||||
void |
setWindow(int type, long windowStartMillis, long windowLengthMillis, PendingIntent operation) 注册一个闹铃,这个闹铃将在给定的时间窗口内被触发 |
Constants (类型) |
||||||||||||||||
public static final int ELAPSED_REALTIME Constant Value: 3 (0x00000003) 这种类型的闹铃不会唤醒系统,如果这种闹铃在系统休眠状态终止,它会在系统下次唤醒的时候被触发。该种闹铃所用的时间是相对时间,是从系统启动后开始 计时的,包括睡眠时间,可以通过调用 SystemClock.elapsedRealtime() 获得。 |
||||||||||||||||
public static final int ELAPSED_REALTIME_WAKEUP Constant Value: 2 (0x00000002) 这种类型的闹铃能在终止的时候唤醒系统,用法同 ELAPSED_REALTIME。 |
||||||||||||||||
public static final long INTERVAL_DAY Constant Value: 86400000 (0x0000000005265c00) |
||||||||||||||||
public static final long INTERVAL_FIFTEEN_MINUTES Constant Value: 900000 (0x00000000000dbba0) |
||||||||||||||||
public static final long INTERVAL_HALF_DAY Constant Value: 43200000 (0x0000000002932e00) |
||||||||||||||||
public static final long INTERVAL_HALF_HOUR Constant Value: 1800000 (0x00000000001b7740) |
||||||||||||||||
public static final long INTERVAL_HOUR Constant Value: 3600000 (0x000000000036ee80) |
||||||||||||||||
public static final int RTC Constant Value: 1 (0x00000001) 这种类型的闹铃不会唤醒系统,如果这种闹铃在系统休眠状态终止,它会在系统下次唤醒的时候被触发。该闹铃所用的时间是绝对时间,可以通过调用 System.currentTimeMillis() (wall clock time in UTC) 获得。 |
||||||||||||||||
public static final int RTC_WAKEUP Constant Value: 0 (0x00000000) 这种类型的闹铃能在终止的时候唤醒系统,用法同 RTC。 |
注意一个重要的参数 PendingIntent。这个 PendingIntent 可以说是 Intent 的进一步封装, 因为它不仅对 Intent 进行了描述,也对使用该 Intent 所要完成的目标动作进行了描述。开发者可以通过以下六个方法来获得 PendingIntent 实例。(参考官方文档:PendingIntent | Android Developers)
PendingIntent Public Methods (方法) |
||||||||||||||||
static PendingIntent |
getActivities(Context context, int requestCode, Intent[] intents, int flags) 方法同 getActivity(Context, int, Intent, int),但允许提交一个由多个 Intent 组成的数组 |
|||||||||||||||
static PendingIntent |
getActivities(Context context, int requestCode, Intent[] intents, int flags, Bundle options) 方法同 getActivity(Context, int, Intent, int),但允许提交一个由多个 Intent 组成的数组 |
|||||||||||||||
static PendingIntent |
getActivity(Context context, int requestCode, Intent intent, int flags) 返回一个可以打开新 Activity 的 PendingIntent,相当于调用 Context.startActivity(Intent)。 |
|||||||||||||||
static PendingIntent |
getActivity(Context context, int requestCode, Intent intent, int flags, Bundle options) 返回一个可以打开新 Activity 的 PendingIntent,相当于调用 Context.startActivity(Intent)。 |
|||||||||||||||
static PendingIntent |
getBroadcast(Context context, int requestCode, Intent intent, int flags) 返回一个可以发送广播的 PendingIntent,相当于调用 Context.sendBroadcast()。 |
|||||||||||||||
static PendingIntent |
getService(Context context, int requestCode, Intent intent, int flags) 返回一个可以启动服务的 PendingIntent,相当于调用 Context.startService()。 |