參考##
1.《Android開發(fā)藝術(shù)探索》
主要針對隱式調(diào)用,隱士調(diào)用需要intent能夠匹配目標(biāo)組件的IntentFilter所設(shè)置的信息,如:啟動服務(wù)、廣播禁灼、Activity等;
IntentFilter的過濾信息有action轿曙、category弄捕、data僻孝,
如下:
<!-- 對外處理推送,web打開app的中轉(zhuǎn)Activity -->
<activity
android:name=".open.TransferActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
<intent-filter android:priority="0x7FFFFFFF" >
<action android:name="android.intent.action.VIEW" />
<!-- 顯示數(shù)據(jù) -->
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- 定義成瀏覽器類型守谓,有URL需要處理時會過濾 -->
<data
android:host="better.com"
android:scheme="open.better" />
</intent-filter>
</activity>
為匹配規(guī)則列表穿铆,需要同時匹配過濾列表中 action、category斋荞、data信息荞雏;
action的匹配規(guī)則###
action是一個字符串,系統(tǒng)也預(yù)定義了一些平酿,我們也可以自定義凤优,如要匹配,必須和intent中的action的完全一致蜈彼,并區(qū)分大小寫筑辨;
只要intent中的action能夠和過濾規(guī)則中的任何一個action相同,即匹配成功幸逆;
常用的系統(tǒng)的自帶的action:
- Intent.ACTION_MAIN( android.intent.action.MAIN ): 應(yīng)用入口棍辕;
- Intent.ACTION_VIEW(android.intent.action.VIEW): 用于顯示用戶的數(shù)據(jù),比較通用还绘,會根據(jù)用戶的數(shù)據(jù)類型打開相應(yīng)的Activity楚昭;
category的匹配規(guī)則###
與action類型,系統(tǒng)也預(yù)定義了一些蚕甥; 如果intent中含有category哪替,如果目標(biāo)組件中栋荸,含有此category菇怀,則表示匹配成功;另外系統(tǒng)會默認(rèn)在intent添加 android.intent.category.DEFAULT晌块,這個category爱沟,為了 activity能接收到隱式調(diào)用,需要在intent-filter中指定 DEFAULT這個category匆背,如上圖呼伸;
data的匹配規(guī)則###
data的匹配規(guī)則和action類似,如果過濾規(guī)則中钝尸,定義了data括享,那么intent中,也要定義可匹配的data珍促;
data的語法結(jié)構(gòu)
<data android:scheme="string"
android:host=""
android:port=""
android:path=""
android:pathPattern=""
android:pathPrefix=""
android:mimeType=""
/>
她其實(shí)就是由2部分組成:mimeType 和 URI铃辖,mimeType指定媒體類型,如:image/jpeg,
uri為:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|pathPattern]
path表示完整的路徑信息猪叙;
pathPattern亦可表示路徑娇斩,但可包含通配符()仁卷,如:"\", 表示匹配任何字符;
pathPrefix表示路徑前綴犬第;
data匹配規(guī)則
data要求intent中必須含有data數(shù)據(jù)锦积,并且data數(shù)據(jù)能夠完成匹配過濾規(guī)則中的某一個data。這里完全匹配指定的是過濾規(guī)則中的data部分也出現(xiàn)在了intent中的data中歉嗓;
- 如下規(guī)則:
<!-- -->
<intent-filter>
<data android:mimeType="image/*"/>
....
</intent-filter>
指定媒體類型為所有圖片丰介,如:intent為 intent.setDataAndType(Uri.parse("file://abc"), "image/png") ;這種intentFilter雖然沒有指定URI遥椿,系統(tǒng)會有默認(rèn)值設(shè)定基矮,默認(rèn)值為content和file;即:URI的schema是有默認(rèn)值的;
如要為intent指定完整的data冠场,必須要調(diào)用 setDataAndType方法家浇;
避免異常###
如果通過intent隱式意圖來啟動activity,如果沒有任何匹配碴裙,App會crash钢悲,為避免此情況發(fā)生,
可以先判斷一下舔株,采用PackageManger的resolveActivity或 Intent的resolveActivity方法莺琳;
具體的例子###
回到,文章開頭的示例配置载慈,我們配置了惭等,可以通過瀏覽器(category:android.intent.category.BROWSABLE),startActivity(android.intent.category.DEFAULT) 2種外部啟動方式办铡,來啟動該Activity辞做;
// 通過intent來啟動,比如:其他app寡具,打開本app秤茅,需要傳遞特定參數(shù)時
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("open.better://better.com?type=otherInfo"); // type為傳遞的參數(shù);
intent.setData(uri);
startActivity(intent);
// 通過http:// 鏈接形式啟動
<a href="open.better://better.com?type=type01">打開Better</a>
// 具體解析:
Uri data = getIntent().getData(); // 來自外部鏈接
// 處理intent
Intent bizIntent = null;
// 來自 外部啟動
if (data != null) {
String scheme = data.getScheme(); // scheme
// 如果來著 web 啟動
if (“open.better”.equals(scheme)) {
String host = data.getHost(); // host
String type = StringUtils.convertToSafeString(data.getQueryParameter("type"));
// 其他操作