Android 四大元件之Activity的IntentFilter匹配規則小述
一、概述
本節主要介紹Activity的IntentFilter匹配規則,其是我們在隱式啟動一個Activity的過程中所用到的知識點,在這裡我就大概的介紹下,隱式啟動一個Activity需要我們的Intent能夠匹配待啟動Activity的IntentFilter中所設定的過濾資訊,如果與之不匹配則無法啟動該Activity。IntentFilter中的過濾資訊包括action、categoty、data三種,下面我們來具體分析一下
二、匹配action
這是我們的ActivitySummary6在清單中的< activity >程式碼,注意當不想設定category特定值時,也需要將其設定為android.intent.category.DEFAULT,否則報錯
<activity android:name=".ActivitySummary6">
<intent-filter>
<action android:name="zmj.componentssummary.06"/>
//當不想新增category時,也得新增DEFAULT,否則報錯,原因如下
<category android:name="android.intent.category.DEFAULT"/>
< /intent-filter>
</activity>
我們在ActivitySummary5介面啟動上面的ActivitySummary6介面,程式碼如下
Intent intent = new Intent();
intent.setAction("zmj.componentssummary.06");
startActivity(intent);
當我們沒有呼叫addCategory()方法時,系統會預設呼叫intent.addCategory(“android.intent.category.DEFAULT”),這也是我們在清單中不加category為什麼會報錯的原因。當然在清單< activity >中,我們也可以定義多個action值,匹配規則即當我們Intent所攜帶的action值能與其中一個action值完全相同即可算匹配成功。
三、匹配category
這是我們的ActivitySummary5在清單中的< activity >程式碼,注意在< intent-filter >標籤裡,< action > 和 < category >標籤需要同時存在,否則會報錯
<activity android:name=".ActivitySummary5">
<intent-filter>
//必須存在action,當只有categary時報錯
<action android:name="zmj.componentssummary.05"/>
//這是我們自己定義的category標籤
<category android:name="zmj.componentssummary.category05"/>
//DEFAULT這個category標籤不能去掉,否則會報錯
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在我們的ActivitySummary6中啟動我們的ActivitySummary5,程式碼如下
Intent intent = new Intent();
intent.setAction("zmj.componentssummary.05");
intent.addCategory("zmj.componentssummary.category05");
startActivity(intent);
當然我們也可以在清單中新增多個自定義category,匹配規則即如果我們的Intent含有category,那麼我們所有的category都必須和過濾規則中的其中一個category相同。
四、匹配data
不同於action和category的字串格式,data的資料格式稍微有點複雜
<data
android:mimeType="媒體型別,例如image/*、image/jpeg、audio/mpeg4-generis、video/*"
android:scheme="URI的模式,例如http、file、content"
android:host="主機名,例如www.baidu.com"
android:port="埠號,例如8080"
android:path="/完整的路徑資訊"
android:pathPattern="完整的路徑資訊,可以包含萬用字元"
android:pathPrefix="/路徑的字首資訊"/>
不過其實常用的也很簡單,例如這是咱們的ActivitySummary7,需要注意的是,< data >必須和< action >和< category >共同作用,自己不能單獨使用,否則會報錯
<activity android:name=".ActivitySummary7">
<intent-filter>
<action android:name="zmj.componentssummary.07"/>
<category android:name="android.intent.category.DEFAULT"/>
<data
android:mimeType="image/png"
/>
</intent-filter>
</activity>
這是我們啟動ActivitySummary7的程式碼
Intent intent = new Intent();
intent.setAction("zmj.componentssummary.07");
// 未指定過濾規則中的URI模式,即scheme的值,URI就會取預設值content和file
intent.setDataAndType(Uri.parse("file://abc"), "image/png");
startActivity(intent);
還有一點需要注意的是,當我們沒有指定過濾規則中的URI模式,即scheme的值時,URI就會取預設值content和file,所以我們啟動的時候Intent必須攜帶URI模式型別才能與之匹配,同時,< data >也支援新增多個,匹配規則即Intent所攜帶的data必須能夠和過濾規則中的其中一個完全匹配。
五、總結
本節主要簡單介紹了< intent-filter >的匹配規則,如果想要檢視更多四大元件的基礎知識,去我的部落格目錄裡檢視吧,因為關於每塊知識點的介紹,部落格單節寫的比較零散,不容易查詢。