1. 程式人生 > >Android Intent隱式啟動的匹配規則

Android Intent隱式啟動的匹配規則

隱式呼叫需要Intent能夠匹配目標元件的IntentFilter(<activity>標籤中的<intent-filter>)中所設定的過濾資訊

 

IntentFilter的過濾資訊包括action,category,data

 

只有一個Intent同時匹配 action,category,data才算完全匹配

一個activity可以有多個<intent-filter>標籤,intent只有匹配任何一組<intent-filter>標籤就可以啟動activity

 

action :

系統預定義了一些action,我們也可以自定義一些action

匹配規則是intent的action和activity的action的字串完全一樣,一個過濾規則可以有多個action,只要任何一個action相同就算匹配成功

注意字串區分大小寫

 

category:

Intent可以沒有category,但是有幾個category就必須都匹配上activity中的其中一個

為什麼沒有category也可以匹配上呢

因為activity必須新增預設category為"android.intent.category.DEFAULT",並且intent沒有category啟動時會預設加上"android.intent.category.DEFAULT"

 

data:

data匹配規則和action一樣

data的結果由mineType和URI組成

mineType指媒體型別,比如image/jpeg,audio/mpeg4-generic,viede/*等,可以表示圖片,文字,視訊等不同媒體格式

URI包含的項就比較多了,scheme模式,host主機名,port埠號,path完整路徑,pathPattern可以帶萬用字元的完整路徑,pathPrefix路徑字首

 

過濾規則的data帶有URI預設值為file和content

intent.setDataAndType(p1,p2),如果先setType再setData會相互覆蓋(不知道當前版本是否依舊)

 

 

 

____________________________分割線_____________________________

 

我們可以在隱式intent啟動前判斷一下是否存在能匹配到的activity

用PackageManager的resolveActivity方法判斷或者intent的resolveActivity(返回最佳匹配activity資訊)

PackageManager還提供queryIntentActivity方法判斷所有能匹配到的activity

 

主activity過濾規則包括

<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>