1. 程式人生 > >顯式與隱式Intent及AndroidManifest.xml檔案中intent-filter引數說明

顯式與隱式Intent及AndroidManifest.xml檔案中intent-filter引數說明

1、顯式Intent通常用於程式內部間的元件通訊,已經明確的定義了目標元件的資訊,所以不需要系統決策用哪個目標元件.

Intent明確的指定了要啟動的Acitivity,如下:

Intent intent = new Intent(Context packageContext, Class<?> clas);

startActivity(intent);

2、隱式Intent不指明目標元件的class,只定義希望的Action、Category和Data,由系統決定使用哪個目標元件。這也是Android系統的一大亮點。

Intent沒有明確的指定要啟動哪個Activity ,而是通過設定一些Intent Filter來讓系統去篩選合適的Acitivity去啟動。

intent到底發給哪個activity,需要進行三個匹配,一個是action,一個是category,一個是data。

先舉個例子,在Java程式碼裡隱式跳轉到別的Activity:

Intent intent = new Intent("myActionName");
intent.addCategory("myCategoryFilter1");
intent.addCategory("myCategoryFilter2");
startActivity(intent);

這樣並沒有明確指明要跳轉到哪個Activity,而此時,程式就會在AndroidManifest.xml檔案中查詢滿足過濾條件的activity宣告,一旦某一個Activity滿足了上面的action和category,就跳轉到該activity。如果有多個activity都滿足條件,那麼將會出現一個選擇對話方塊,讓使用者選擇跳轉到哪個activity。

例如在AndroidManifest.xml中有如下兩個Activity滿足匹配條件:

<activity  android:name="ThirdActivity" android:label="activity3">
      <intent-filter>
          <action android:name="myActionName" />
          <category android:name="android.intent.category.DEFAULT" /> 
          <category android:name="myCategoryFilter1" />
          <category android:name="myCategoryFilter2" />
     </intent-filter>

</activity>
<activity  android:name="FourthActivity" android:label="activity4">
     <intent-filter>
          <action android:name="myActionName" />
          <category android:name="android.intent.category.DEFAULT" /> 
          <category android:name="myCategoryFilter1" />
          <category android:name="myCategoryFilter2" />
    </intent-filter>

</activity>

出現的選擇對話方塊如圖:

對於action:

一條<intent-filter>元素至少應該包含一個<action>,否則任何Intent請求都不能和該<intent-filter>匹配。如果Intent請求的Action和<intent-filter>中個某一條<action>匹配,那麼該Intent就通過了這條<intent-filter>的動作測試。如果Intent請求或<intent-filter>中沒有說明具體的Action型別,那麼會出現下面兩種情況。
(1) 如果<intent-filter>中沒有包含任何Action型別,那麼無論什麼Intent請求都無法和這條<intent-filter>匹配;
(2) 反之,如果Intent請求中沒有設定Action型別,那麼只要<intent-filter>中包含有Action型別,這個Intent請求就將順利地通過<intent-filter>的行為測試。

對於category:

intent物件中的每個種類必須匹配過濾器中的一個。即過濾器能夠列出額外的種類,但是intent物件中的種類都必須能夠在過濾器中找到,只有一個種類在過濾器列表中沒有,就算種類檢測失敗!

原則上如果一個intent物件中沒有種類(即種類欄位為空)應該總是通過種類測試,而不管過濾器中有什麼種類。但是,Android中所有隱式intent至少都預設包含android.intent.category.DEFAULT。因此,活動想要接收隱式intent必須要在intent過濾器中包含"android.intent.category.DEFAULT"。

注意:"android.intent.action.MAIN" 和 "android.intent.category.LAUNCHER"設定,它們分別標記活動開始新的任務和帶到啟動列表介面。它們可以包含"android.intent.category.DEFAULT"到種類列表,也可以不包含。

對於data:

<data>元素指定了希望接受的Intent請求的資料URI和資料型別,URI被分成三部分來進行匹配:scheme、authority和path。其中,用setData()設定的Inteat請求的URI資料型別和scheme必須與IntentFilter中所指定的一致。若IntentFilter中還指定了authority或path,它們也需要相匹配才會通過測試。

intent-filter所有引數的目的:是過濾意圖intent,使系統能夠根據這些條件找到匹配的activity,並啟動最合適的activity