023.PendingIntent 概述

   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會被換成最新的內容。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章