Intent不應(yīng)該同時(shí)存在顯示調(diào)用及隱示調(diào)用,同時(shí)存在時(shí)以顯示調(diào)用為準(zhǔn) 。隱式調(diào)用需要Intent能夠匹配目標(biāo)組件的IntentFilter中所設(shè)置的過濾信息,如果不匹配將無法啟動(dòng)目標(biāo)組件。
IntentFilter的過濾信息有:action, category, data 。
匹配規(guī)則:
- 需同時(shí)匹配過濾列表中的action, category, data信息,否則匹配失敗
- 一個(gè)過濾列表中action, category, data可以有多個(gè),一個(gè)Activity可以有多個(gè)IntentFilter
- 一個(gè)Intent只要能匹配任何一組IntentFilter就可以成功啟動(dòng)組件
各屬性的匹配規(guī)則:
action的匹配規(guī)則
- action是一個(gè)字符串,可以是系統(tǒng)預(yù)定義的,也可以定義自己的
- 匹配是指完全相同,區(qū)分大小寫。
- 只要能夠和過濾規(guī)則中任何一個(gè)action匹配即可匹配成功。
- 如果Intent沒有指定 action,那么失敗。
category的匹配規(guī)則
- category是一個(gè)字符串,可以是系統(tǒng)預(yù)定義的,也可以定義自己的
- Intent中category可以有多個(gè),每一個(gè)都必須與過濾規(guī)則中的一個(gè)category相同
- 如果Intent中沒有設(shè)置category,默認(rèn)會加上
android.intent.category.DEFAULT這個(gè)categroy - 為了組件能接收隱式調(diào)用,就必須在intent-filter中指定
android.intent.category.DEFAULT這個(gè)categroy(由于上面原因)
data的匹配規(guī)則
- Intent中必須有data,data數(shù)據(jù)能完全匹配過濾規(guī)則中的某個(gè)data
- data語法
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string"/>
data由mimeType 和 URI 兩部分組成。
mimeType指媒體類型,如image/jpeg、audio/meeg4-generic和video/*等
URI結(jié)構(gòu):
<sheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
URI如果沒有指定,schema默認(rèn)值為content和file。
為Intent指定完整的data,必須調(diào)用setDataAndType方法,不能調(diào)用setData后再試用setType,因?yàn)閮蓚€(gè)方法會相互清空對方的值。
其它
- 入口intent-filter
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
- 判斷是否有Activity可以匹配隱式Intent
intent.resolveActivity(PackageManager pm)返回null表示找不到匹配
PackageManager pManager = this.getPackageManager();
List<ResolveInfo> list=pManager.queryIntentActivities(intent,flags);
if(list==null){
//沒有找到匹配的
}
ResolveInfo rf=pManager.resolveActivity(intent,flags);
if(rf==null){
//沒有找到匹配的
}
flags指定MATCH_DEFAULT_ONLY這個(gè)標(biāo)志位,僅匹配intent-filter中聲明了<category android:name="android.intent.category.DEFAULT"/>這個(gè)category的Activity。用此參數(shù),如果查出的不為空,一定成功。