android中的定時任務
阿新 • • 發佈:2019-02-03
- 資料來源 《第一行程式碼》
兩種方法
- 一個是java的Timer類。一個是android的Alarm機制。
Timer類有一個缺陷,不適用長期在後臺執行的定時任務。因為,android手機在長時間不操作的情況下,CPU會進入休眠,這樣導致Timer的定時任務無法正常執行。
Alarm則具有喚醒CPU的功能,可以保證大多數情況下,需要執行定時任務時,cpu都能正常工作。
注意一點:喚醒CPU和喚醒螢幕不是一回事。
AlarmManager的4種工作型別:
- public static final int ELAPSED_REALTIME = 3;
讓定時任務的觸發時間從系統開機時間算起,但不會喚醒cpu - public static final int ELAPSED_REALTIME_WAKEUP = 2;
讓定時任務的觸發時間從系統開機時間算起,會喚醒cpu - public static final int RTC = 1;
讓定時任務的觸發時間從1970年1月1日0點算起,不會喚醒cpu - public static final int RTC_WAKEUP = 0;
讓定時任務的觸發時間從1970年1月1日0點算起,會喚醒cpu
系統獲取時間的方法有兩個:
SystemClock.elapsedRealtime()
獲取到系統開機至今所經歷時間的毫秒數System.currentTimeMillis()
獲取到1970年1月1日0點至今所經歷時間的毫秒數
注意:
4.4以後Alarm任務觸發時間將變的不精確,有可能延遲一段時間後任務才能得到執行。這是系統在耗電方面進行的優化。系統會自動檢測目前有多少個Alarm任務存在。然後將觸發時間相近的幾個任務放在一起執行,這就可以大幅度減少cpu被喚醒的次數,從而有效延長電池的使用時間。
如果要保證精確,使用setExact()方法。
m.set(int type, long triggerAtMillis, PendingIntent operation);
m.setExact(int type, long triggerAtMillis, PendingIntent operation);