1. 程式人生 > >利用pendingintent 和AlarmManager實現定時任務的一些分析

利用pendingintent 和AlarmManager實現定時任務的一些分析

PendingIntent
獲取 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物件
其中requestCode:Private request code for the sender
flags:

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。
注意:


1.requestCode不同會導致獲取的PendingIntent不同。
2.兩個PendingIntent對等是指它們的operation一樣, 且其它們的Intent的action, data, categories, components和flags都一樣。但是它們的Intent的Extra可以不一樣

AlarmManager
AlarmManager的鬧鐘型別及方法:

Android系統提供了四種類型的鬧鐘:

(1)、ELAPSED_REALTIME:在指定的延時之後傳送Intent,但不喚醒裝置

(2)、ELAPSED_REALTIME_WAKEUP:在指定的延時之後傳送Intent,同時喚醒裝置 延時是會把系統啟動的時間SystemClock.elapsedRealtime()算進去!!

(3)、RTC:在指定的時刻傳送Intent,但不喚醒裝置

(4)、RTC_WAKEUP:在指定的時刻傳送Intent,同時喚醒裝置

AlarmManager的方法:

(1)、void set(int type, long triggerAtTime, PendingIntent operation)
註冊一個鬧鐘

(2)、void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
註冊一個會重複的鬧鐘

(3)、void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
註冊一個重複鬧鐘的不精確版本,它相對而言更節能(power-efficient)一些,因為系統可能會將幾個差不多的鬧鐘合併為一個來執行,減少裝置的喚醒次數。
內建的幾個interval為:
INTERVAL_FIFTEEN_MINUTES
INTERVAL_HALF_HOUR
INTERVAL_HOUR
INTERVAL_HALF_DAY
INTERVAL_DAY
如果你將其設為DAY,那麼可能這一天中的所有鬧鐘都會被合併掉。

(4)、void cancel(PendingIntent operation)
取消一個註冊的鬧鐘

(5)、void setTimeZone(String timeZone)
設定系統的預設時區。需要android.permission.SET_TIME_ZONE許可權

(5)、voidsetTime(long millis)

設定系統掛鐘時間,需要android.permission.SET_TIME許可權

在使用時:
AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
Intent i = new Intent();
i.setAction(action);
i.putExtra(“key”, “value”);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0,
i, PendingIntent.FLAG_UPDATE_CURRENT);
final long time = System.currentTimeMillis();
am.setRepeating(AlarmManager.RTC_WAKEUP, time, 10 * 1000, pi);
如果想要修改Intent中PutExtra()中的值
需要重新 pi = PendingIntent.getBroadcast(getApplicationContext(), 0,
i, PendingIntent.FLAG_UPDATE_CURRENT);
重新 am.setRepeating()
自己做的實驗,如果新的pi和之前的pi是同等的,在重新am.setRepeating()之前沒有am.cancel(pi),沒有看出來有什麼影響
並且設定PendingIntent.FLAG_UPDATE_CURRENT和FLAG_CANCEL_CURRENT沒有看出區別,不過不要設定成FLAG_ONE_SHOT,因為如果設定了這個,則只會執行一次,不會重複
網上介紹的比較好的文章:
http://blog.csdn.net/hudashi/article/details/7060837
http://my.oschina.net/youranhongcha/blog/196933?p=2#comments
http://www.cnblogs.com/mengdd/p/3819806.html