PendingIntent表示一種待定、等待、即將發生的意圖,就是說接下來有一個Intent 將在某個條件下在某個時刻發生。因此PendingIntent和Intent的區別在於,Intent是立即發生的,而PendingIntent則是可能會在某個特地的時刻發生的。PendingIntent典型的應用場景就是給RemoteViews添加點擊事件,因爲RemoteViews運行在遠程進程當中,因此RemoteViews不同於普通的View,無法爲View添加OnClickListener,因此我們需要使用PendingIntent,PendingIntent
通過send和cancel來發送和取消待定的Intent.
PendingIntent 支持第三種帶定的意圖:啓動Activity ,啓動Service 和 發送廣播,對應着它的三個接口方法。如下:
- static PendingIntent.getActivity( Context context , int requestCode , Intent intent , int flags)
獲得一個PendingIntent,該特定意圖發生的時候,相當於Context.startActivity( Intent )
- static PendingIntent.getService( Context context , int requestCode, Intent intent , int flags)
獲得一個PendingIntent ,該特定意圖發生的時候,相當於Context.startService( Intent )
- static PendingIntent.getBroadcast( Context context , int requestCode , Intent intent , int flags)
獲得一個PendingIntent,該特定意圖發生的時候,相當於Context.sendBroadcast( Intent )
上面的第一個和第三個參數不解釋,第二個參數是請求代碼 。一般都是寫0.第四個參數是flags,常見的類型有:FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_CURRENT 。
在介紹這四個Flag之前,先了解一下PendingIntent的匹配規則,也就是在什麼情況下兩個PendingIntent是相同的。
PendingIntent的匹配規則爲:如果兩個PendingIntent它們內部的Intent相同並且requestCode也相同,那麼這兩個PendingIntent就是相同的。那麼,什麼情況下Intent是相同的呢?Intent的匹配規則是:如果兩個Intent的ComponentName 和Intent-filter相同,那麼兩個Intent就是相同的。需要注意的是Extras
不參與Intent的匹配過程,只要Intent的ComponentName和Intent-filter相同,即使Extras不同,那麼這兩個Intent也是相同的。
FLAG_ONE_SHOT
當前描述的PendingIntent只能被使用一次,然後它就會被自動cancel,如果後續還有相同的PendingIntent,那麼它們的send方法就會調用失敗。對於通知欄來說,如果採用此標記位,那麼同類的通知只能使用一次,後續的通知單擊以後就無法執行我們想要的行爲。
FLAG_NO_CREATE
當前描述的PendingInent不會被主動創建,如果當前的PendingIntent之前不存在,那麼那getActivity等方法會返回null ,也就是說會獲取PendingIntent失敗。這個標記位不能單獨使用,它能使用的前提是,之前存在着相同的PendingInent(Intent
和requestCode).
FLAG_CANCEL_CURRENT
當前描述的PendingIntent如果已經存在,那麼它們就會被cancel,然後系統會創建一個新的PendingIntent。對於通知欄消息來說,那些被cancel的消息單擊後將無法打開。比如,通知欄有1條消息了,我這時候再發送一個requestCode和intent一樣的PendingIntent設爲FLAG_CANCEL_CURRENT
那麼,之前那條就會被取消掉。
FLAG_UPDATE_CURRENT
當前描述的PendingIntent如果已經存在,那麼它們就會被更新,也就是Intent中的Extras會被換成最新的內容。