對應 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()。 |
?
?