PendingIntent和AlarmManager--------啓動定時任務及詳解

pendingintent使用的三種情況

你可以通過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的第4個參數

FLAG_CANCEL_CURRENT:如果當前系統中已經存在一個相同的PendingIntent對象,那麼就將先將已有的PendingIntent取消,然後重新生成一個PendingIntent對象。

FLAG_NO_CREATE:如果當前系統中不存在相同的PendingIntent對象,系統將不會創建該PendingIntent對象而是直接返回null。

FLAG_ONE_SHOT:該PendingIntent只作用一次。在該PendingIntent對象通過send()方法觸發過後,PendingIntent將自動調用cancel()進行銷燬,那麼如果你再調用send()方法的話,系統將會返回一個SendIntentException。

FLAG_UPDATE_CURRENT:如果系統中有一個和你描述的PendingIntent對等的PendingInent,那麼系統將使用該PendingIntent對象,但是會使用新的Intent來更新之前PendingIntent中的Intent對象數據,例如更新Intent中的Extras。

 

AlarmManger啓動定時任務,其常用的方法

(1)set(int type,long startTime,PendingIntent pi);
        該方法用於設置一次性鬧鐘,第一個參數表示鬧鐘類型,第二個參數表示鬧鐘執行時間,第三個參數表示鬧鐘響應動作。
(2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

        該方法用於設置重複鬧鐘,第一個參數表示鬧鐘類型,第二個參數表示鬧鐘首次執行時間,第三個參數表示鬧鐘兩次執行的間隔時間,第四個參數表示鬧鐘響應動作。類似JAVA的Timer裏面scheduleAtFixedRate(TimerTask task, long delay, long period):以近似固定的時間間隔(由指定的週期分隔)進行後續執行。在固定速率執行中,根據已安排的初始執行時間來安排每次執行。如果由於任何原因(如垃圾回收或其他後臺活動)而延遲了某次執行,則將快速連續地出現兩次或更多的執行,從而使後續執行能夠“追趕上來”。從長遠來看,執行的頻率將正好是指定週期的倒數(假定 Object.wait(long) 所依靠的系統時鐘是準確的)。

(3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
        該方法也用於設置重複鬧鐘,與第二個方法相似,不過其兩個鬧鐘執行的間隔時間不是固定的而已。它相對而言更節能(power-efficient)一些,因爲系統可能會將幾個差不多的鬧鐘合併爲一個來執行,減少設備的喚醒次數。 有點類似JAVA的Timer裏面schedule(TimerTask task, Date firstTime, long period):根據前一次執行的實際執行時間來安排每次執行。如果由於任何原因(如垃圾回收或其他後臺活動)而延遲了某次執行,則後續執行也將被延遲。在長期運行中,執行的頻率一般要稍慢於指定週期的倒數(假定 Object.wait(long) 所依靠的系統時鐘是準確的)。

(4)cancel(PendingIntent operation)
       取消一個設置的鬧鐘

(5)setTimeZone(String timeZone)
       設置系統的默認時區。需要android.permission.SET_TIME_ZONE權限

註解:使用alarmManager啓動service時,用service的action(service在manifest中聲明多個action)來啓動,防止用service.class導致pendingintent相互覆蓋影響的情況!重要!

發佈了54 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章