天天看點

PendingIntent原理

在Android開發中,很多地方都要用到PendingIntent,比如Alarm。顧名思義,PendingInten并不是Intent,而是對Intent包裝,然後在後續某個時間執行intent。

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 ()把其從系統中移除掉。