Android,定時任務AlarmManager

AlarmManager 按字面看是鬧鐘管理器。通過對它的使用,可以實現:

(1)在指定時長後執行某項操作(2)週期性的執行某項操作

AlarmManager對象需要配合Intent使用,可以定時的開啓一個Activity,發送一個BroadCast,或者開啓一個Service.

AlarmManager常用的方法有以下幾個:

// 取消已經註冊的與參數匹配的定時器
void cancel(PendingIntent operation)
//註冊一個新的延遲定時器
void set(int type, long triggerAtTime, PendingIntent operation)
//註冊一個重複類型的定時器
void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
//註冊一個非精密的重複類型定時器
void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
//設置時區
void setTimeZone(String timeZone)
定時器主要類型(type參數):

public static final int ELAPSED_REALTIME
// 當系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是相對時間,是從系統啓動後開始計時的,包括睡眠時 間,可以通過調用SystemClock.elapsedRealtime()獲得。系統值是3 (0x00000003)。

public static final int ELAPSED_REALTIME_WAKEUP
//能喚醒系統,用法同ELAPSED_REALTIME,系統值是2 (0x00000002) 。

public static final int RTC
//當系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是絕對時間,所用時間是UTC時間,可以通過調用 System.currentTimeMillis()獲得。系統值是1 (0x00000001) 。

public static final int RTC_WAKEUP
//能喚醒系統,用法同RTC類型,系統值爲 0 (0x00000000) 。
AlarmManager使用的Intent叫PendingIntent。

a. Intent是立即使用的,而PendingIntent可以等到事件發生後觸發,PendingIntent可以cancel

b. Intent在程序結束後即終止,而PendingIntent在程序結束後依然有效

c. PendingIntent自帶Context,而Intent需要在某個Context內運行

d. Intent在原task中運行,PendingIntent在新的task中運行

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

PendingIntent用於描述Intent及其最終的行爲.

你可以通過getActivity(Context context, int requestCode, Intent intent, int flags)系列方法從系統取得一個用於啓動一個Activity的PendingIntent對象,

可以通過getService(Context context, int requestCode, Intent intent, int flags)方法從系統取得一個用於啓動一個Service的PendingIntent對象

可以通過getBroadcast(Context context, int requestCode, Intent intent, int flags)方法從系統取得一個用於向BroadcastReceiver的Intent廣播的PendingIntent對象

返回的PendingIntent可以遞交給別的應用程序,然後繼續處理。這裏的話你可以稍後才處理PendingIntent中描述的Intent及其最終行爲。

當你把PendingIntent遞交給別的程序進行處理時,PendingIntent仍然擁有PendingIntent原程序所擁有的權限(with the same permissions and identity).當你從系統取得一個PendingIntent時,一定要非常小心纔行。比如,通常,如果Intent目的地是你自己的component(Activity/Service/BroadcastReceiver)的話,你最好採用在Intent中顯示指定目的component名字的方式,以確保Intent最終能發到目的,否則Intent最後可能不知道發到哪裏了。一個PendingIntent就是Android系統中的一個token(節點,這個應該是Linux或C\C++用語)的一個對象引用,它描述了一些將用於retrieve的數據(這裏,這些數據描述了Intent及其最終的行爲)。

這就意味着即使PendingIntent原進程結束了的話, PendingIntent本身仍然還存在,可在其他進程(PendingIntent被遞交到的其他程序)中繼續使用.如果我在從系統中提取一個PendingIntent的,而系統中有一個和你描述的PendingIntent對等的PendingInent, 那麼系統會直接返回和該PendingIntent其實是同一token的PendingIntent,而不是一個新的token和PendingIntent。然而你在從提取PendingIntent時,通過FLAG_CANCEL_CURRENT參數,讓這個老PendingIntent的先cancel()掉,這樣得到的pendingInten和其token的就是新的了。

通過FLAG_UPDATE_CURRENT參數的話,可以讓新的Intent會更新之前PendingIntent中的Intent對象數據,例如更新Intent中的Extras。另外,我們也可以在PendingIntent的原進程中調用PendingIntent的cancel ()把其從系統中移除掉。

AlarmManager的取消:(其中需要注意的是取消的Intent必須與啓動Intent保持絕對一致才能支持取消AlarmManager)

AlarmManager 生命週期:

repeating AlarmManager一旦啓動就會一直在後臺運行(除非執行cancel方法),可以在“應用管理”中看到這個應用狀態是正在運行。 “強行停止”可以讓Alarmmanager停掉。

嘗試了幾種任務管理器, 都只能重置計數器(確實釋放內存了),但都無法關閉定時器,只有系統自帶的“強行停止”奏效。

如果某個AlarmManager已經啓動, 程序又再次去啓動它,只要PendingIntent是一樣,那麼之前那個AlarmManager會被release掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章