原則上一個Intent不應(yīng)該即是顯式調(diào)用有是隱式調(diào)用,如果二者共存以顯式調(diào)用為主。
顯式調(diào)用
需要明確指定被啟動對象的組件信息,包括包名和類名。一般是在相同的應(yīng)用程序內(nèi)部實現(xiàn)的。
Intent intent = new Intent(MainActivity.this, TestActivity.class);
startActivity(intent);
隱式調(diào)用
IntentFilter中設(shè)置過濾信息action、category、data,系統(tǒng)根據(jù)隱式意圖中的設(shè)置匹配過濾信息,只有同時匹配action類別、category類別、data類別才是能成功啟動目標(biāo)Activity。另外一點,一個Activity可以設(shè)置多個intent-filter,匹配任意一組即可。一般是用于在不同應(yīng)用程序之間。
action的匹配規(guī)則
- 一個intent-filter中可以有多個action
- 只要intent中的action能和intent-filter中的任何一個action相同則匹配成功。
- 需要注意的是,intent中沒有指定action,那么匹配失敗。
- 除此之外,action區(qū)分大小寫。
category的匹配規(guī)則
Intent中沒有category可以匹配,寫了就必須是intent-filter中定義的
- category的匹配規(guī)則和action不同,intent中如果出現(xiàn)了category,不管有幾個,都必須是intent-filter中已經(jīng)定義的category,也就是說intent可以沒有category,一旦有,每個都必須和intent filter中定義的任意一個category相同。
- 那為什么我們沒在intent filter中加android.intent.category.DEFAULT這個category會報錯呢?
原因是系統(tǒng)在調(diào)用startActivity或者startActivityForResult的時候會默認(rèn)在intent中加上android.intent.category.DEFAULT這個category。
還是以兩個Activity之間的跳轉(zhuǎn)為例:
Intent intent = new Intent();
intent.setAction("com.dev.test");
intent.addCategory("com.dev.testcat");
startActivity(intent);
AndroidManifest.xml中
<activity android:name=".TestActivity">
<intent-filter>
<action android:name="com.dev.test"/>
<category android:name="com.dev.testcat"/>
//必須加上,否者報錯
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
data的匹配規(guī)則
data的匹配規(guī)則和action類似,如果intent filter中定義了data,那么intent中也必須要定義可匹配的data,否者匹配失敗。
data的結(jié)構(gòu)
data由兩部分組成,mimeType和URI。
- mimeType指媒體類型,比如image/jpeg、text/plaind、video/*等,可以表示圖片、文本、視頻等不同的媒體格式。
- URI的結(jié)構(gòu)
URI結(jié)構(gòu)解析
data的過濾規(guī)則(1)
data規(guī)則不完整。如下所示
<intent-filter>
<data android:mimeType="image/*"/>
</intent-filter>
intent.setDataAndType(Uri.parse("file://abc"),"image/*");
- 這種規(guī)則指定了媒體類型為所有類型的圖片,那么intent中的mimeType屬性必須為“image/*”才能匹配成功
- 這種情況雖然沒有指定URI,但URI部分的schema默認(rèn)值為content或file。也就是說雖然沒有指定URI,但是intent中的URI部分的schema必須為content或者file才能匹配成功,這點尤其需要注意。
data的過濾規(guī)則(1)
定義了多組data規(guī)則,并且每個data都定義了完整屬性,既有URI又有mimeType。如下所示
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" ... />
<data android:mimeType="audio/mpeg" android:scheme="http" ... />
...
</intent-filter>
- 為了匹配這種intent filter,我們也需要在intent中完整定義其中一組data規(guī)則才能匹配成功。
- 另外,如果要為intent指定完整的data,必須調(diào)用setDataAndType方法,不能先調(diào)用setData再調(diào)用setType,因為這兩個方法彼此會清除對方的值。
作者:Dueeeke
鏈接:http://www.itdecent.cn/p/3d077bfd5d29
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。