- IntentFilter中的过滤类型有:action、category、data。 一个Activity可以有多个Filter。
-
action的匹配规则:
只要匹配过滤规则中的任何一个action就能匹配成功,但是必须至少有一个action能与之匹配。 -
category的匹配规则:
如果Intent中有category,那任何一个Category都要和IntentFilter中的Category对应。可以没有category,没有category也能配对成功。 -
data的匹配规则:
和action类似,如果Intent中有,就IntentFilter中必须有一个能与它匹配。
data由两部分组成,mimeType(媒体类型)和URI。
例子1:
通过下面的Intent可以启动下面的IntentFilter:
Intent:
Intent intent = new Intent();
intent.setAction("android:intent.yinsiyitu.action");
intent.addCategory(Intent.CATEGORY_DEFAULT);
//intent.setData(Uri.parse(jianren://www.ggl.com));//会清除前面所有set的type
//intent.setType("application/person");//会清除前面所有的set的data
//这是setData和setType两全的方法,另外如果上面的Activity定义了host,则这里一定也要指定
intent.setDataAndType(Uri.parse("jianren://www.ggl.com"),"application/person");
//如果上面的Activity没有定义host,则Uri.parse("jianren:");至少要写到冒号,不可以只写Uri.parse("jianren")
startActivity(intent);
IntentFilter:
<intent-filter>
<action android:name="android.intent.yinsiyitu.action"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/person"/>
<data android:scheme="jianren" android:host="www.ggl.com"/>
</intent-filter>
[例子2:]
隐式启动安装在手机中的App:
// 评分
try {
Uri uri = Uri.parse("market://details?id="
+ getActivity().getPackageName());
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
} catch (Exception e) {
JDRToast.makeText(mActivity, "没有找到应用商店").show();
Log.e(null, e);
}
因为应用商店类的App会匹配market
这个scheme。
ref:
<Android开发艺术探索Chapter1>
网友评论