顯式與隱式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