概述
Intent隐式意图匹配,一般分为三个action、category、data
为了方便阅读和记忆以及应用,我这里分为过滤规则方、以及匹配方;
更加容易理解,我们把这两个进一步理解为发起方和接收方。发起方,即为Intent隐式意图书写方,接收方,则代表的是需要匹配到的Activity。(这里以Activity为例)
对于action,只需要发起方匹配到接收方的其中一个即可,可以多, 但不可用错。
举个栗子:
接收方
<activity android:name=".intentfiltertest.IntentFilterActivity">
<intent-filter>
<action android:name="com.dhc.intent_action_1" />
<action android:name="com.dhc.intent_action_2" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.dhc.category_1" />
<category android:name="com.dhc.category_2" />
<data
android:mimeType="video/mpeg"
android:scheme="http" />
</intent-filter>
</activity>
发起方:
// Intent intent = new Intent("com.dhc.intent_action_1");
Intent intent = new Intent();
//TODO action必须要正确匹配
intent.setAction("com.dhc.intent_action_2");
// intent.setAction("com.dhc.intent_action_3");
对于category来说,答题跟action一样,但有一点需要注意的是,对于接收方已经定义好了
<category android:name="android.intent.category.DEFAULT" />
这样一条属性的话,发起方可以不制定category,也可以匹配到,因为这个是发起方默认不写情况下,安卓会默认添加上去,除此之外,跟action匹配规则一样
intent.addCategory("com.dhc.category_1");
//TODO category必须要正确匹配
intent.addCategory("com.dhc.category_2");
// intent.addCategory("com.dhc.category_3");
接下来就是data了,data发起方只要保证能够匹配上接收方的某一个data即可,比如对于上面的接收方来说,这样用是OK的。
intent.setDataAndType(Uri.parse("content://abc"), "text/plain");
intent.setDataAndType(Uri.parse("file://abd"), "text/plain");
intent.setDataAndType(Uri.parse("xxxx://abd"), "text/plain");
//TODO data只需要匹配上一个就行
intent.setDataAndType(Uri.parse("http://abc"), "video/mpeg");
对于data需要注意的是,如果接收方没有指定scheme的类型
android:scheme="http"
而是只指明了mimeType等属性,那么默认发起方在书写匹配时,需要在URI当中加上content或者file类型,均可。即
intent.setDataAndType(Uri.parse("content://abc"), "text/plain");
intent.setDataAndType(Uri.parse("file://abd"), "text/plain");
讲到这里,对于发起方和接收方的intentFilter匹配规则就讲解完毕了,其实写一个demo,就什么都清楚了。
对于隐式意图,一定要记得做安全检验,此处将代码送上,一看即明白用法和机制
//TODO 三种方式检验匹配规则,是否存在Activity
PackageManager pm = getPackageManager();
//TODO 此方法OK
List<ResolveInfo> list = pm.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() != 0) {
startActivity(intent);
} else {
Toast.makeText(ActivityA.this, "没有找到对应的Activity",
Toast.LENGTH_SHORT).show();
}
//TODO 此方法OK
// ResolveInfo resolveInfo = pm.resolveActivity(intent,
PackageManager.MATCH_DEFAULT_ONLY);
// if (resolveInfo != null) {
// startActivity(intent);
// } else {
// Toast.makeText(ActivityA.this, "没有找到对应的Activity",
Toast.LENGTH_SHORT).show();
// }
//TODO 此方法OK
// ComponentName name = intent.resolveActivity(pm);
// if (name != null) {
// startActivity(intent);
// } else {
// Toast.makeText(ActivityA.this, "没有找到对应的Activity",
Toast.LENGTH_SHORT).show();
// }
谢谢阅读,如果觉得楼主有写得不对的地方或者不妥的地方,还请大家帮忙指正。
最后
以上就是高兴裙子为你收集整理的Intent隐式意图匹配规则及安全检验的全部内容,希望文章能够帮你解决Intent隐式意图匹配规则及安全检验所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复