1. 程式人生 > >Android 四大元件之Activity的IntentFilter匹配規則小述

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 >的匹配規則,如果想要檢視更多四大元件的基礎知識,去我的部落格目錄裡檢視吧,因為關於每塊知識點的介紹,部落格單節寫的比較零散,不容易查詢。