標籤:android style blog http java 使用
最近再調查手機standby 電流偏高時,跟蹤到了AlarmManager,就對它進行了相關的瞭解。
AlarmManager的使用機制有的稱呼為全域定時器,有的稱呼為鬧鐘。通過對它的使用,它的作用和Timer有點相似。
都有兩種相似的用法:
(1)在指定時間長度後執行某項操作
(2)周期性的執行某項操作
在android系統中,底層系統提供了兩種類型的時鐘,軟時鐘與硬時鐘,軟時鐘就是我們常說的 Timer,硬時鐘就是RTC。系統在正常啟動並執行情況下,Timer工作提供時間服務和鬧鈴提醒,而在系統進入睡眠狀態後,時間服務和鬧鈴提醒由RTC來 負責。對於上層應用來說,我們並不需要關心是 timer還是RTC為我們提供服務,因為android系統的Framework層把底層細節做了封裝並統一提供API。這個API他的名字就叫 AlarmManager。在android系統中有意思的是對應AlarmManage有一個AlarmManagerServie服務程式,該服務程式 才是正真提供鬧鈴服務的,它主要維護應用程式註冊下來的各類鬧鈴並適時的設定即將觸發的鬧鈴給鬧鈴裝置(在android系統中,linux實現的裝置名稱為 "/dev/alarm"),並且一直監聽鬧鈴裝置,一旦有鬧鈴觸發或者是鬧鈴事件發生,AlarmManagerServie服務程式就會遍曆鬧鈴列表 找到相應的註冊鬧鈴並發出廣播。該服務程式在系統啟動時被系統服務程式system_service啟動並初始化鬧鈴裝置(/dev/alarm)。當 然,在Java層的AlarmManagerService與Linux Alarm驅動 程式介面之間還有一層封裝,那就是JNI。
AlarmManager將應用與服務分割開來後,使得應用程式開發人員不用關心具體的服務,而是直接通過AlarmManager來使用這種服務。這也 許就是客戶/服務模式的好處吧。AlarmManager與AlarmManagerServie之間是通過Binder來通訊 的,他們之間是多對一的關係。
常用介面及
void cancel(PendingIntent operation) // 取消已經註冊的與參數匹配的鬧鈴
void set ( int type, long triggerAtTime, PendingIntent operation) // 註冊一個新的鬧鈴
void setRepeating( int type, long triggerAtTime, long interval, PendingIntent operation) // 註冊一個重複類型的鬧鈴
void setTimeZone( String timeZone) // 設定時區
5種鬧鈴類型:
public static final int RTC_WAKEUP = 0;
硬體鬧鐘,當鬧鐘發生時喚醒手機休眠; // 能喚醒系統,用法同RTC類型,系統值為 0 (0x00000000) 。
public static final int RTC = 1;
硬體鬧鐘,不喚醒手機(也可能是其它裝置)休眠;當手機休眠時不發躰鬧鐘。
/*當系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是絕對時間,所用時間是UTC時間,可以通過調用 System.currentTimeMillis()獲得。系統值是1 (0x00000001) 。*/
public static final int ELAPSED_REALTIME_WAKEUP = 2;
真即時間流逝鬧鐘,當鬧鐘發躰時喚醒手機休眠; // 能喚醒系統,用法同ELAPSED_REALTIME,系統值是2 (0x00000002) 。
public static final int ELAPSED_REALTIME = 3;
/當 系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是相對時間,是從系統啟動後開始計時的,包括睡眠時間, 可以通過調用SystemClock.elapsedRealtime()獲得。系統值是3 (0x00000003)。*/
RTC鬧鐘和ELAPSED_REALTIME最大的差別就是前者可以通過修改手機時間觸發鬧鐘事件,後者要通過真即時間的流逝,即使在休眠狀態,時間也會被計算。
adb shell dumpsys alarm
通過這命令可以查看被放到定時隊列裡面的事件
RTC_WAKEUP #1: Alarm{52c2ad84 type 0 com.sina.weibo}
type=0 when=+3m1s330ms repeatInterval=0 count=0
operation=PendingIntent{529fa514: PendingIntentRecord{52a7b220 com.sina.weibo broadcastIntent}}
如果我們就可以看到其中一個微博的alarm 如果我們想看他intent的詳細資料
就可以用下面這個命令
adb shell dumpsys activity intents
然後找到裡面id是52a7b220 的那一段
* PendingIntentRecord{52a7b220 com.sina.weibo broadcastIntent}
uid=10073 packageName=com.sina.weibo type=broadcastIntent flags=0x0
requestCode=1383195892 requestResolvedType=null
requestIntent=act=AlarmTaskSchedule
sent=true canceled=false
Ref:
http://blog.csdn.net/lee576/article/details/8073694/
http://blog.segmentfault.com/masaila/1190000000404684