我是靠谱客的博主 高兴裙子,最近开发中收集的这篇文章主要介绍Intent隐式意图匹配规则及安全检验,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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隐式意图匹配规则及安全检验所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部