Android 四大组件之Activity的IntentFilter匹配规则小述

版权声明:转载请声明: https://blog.csdn.net/MingJieZuo/article/details/83115516

一、概述

本节主要介绍Activity的IntentFilter匹配规则,其是我们在隐式启动一个Activity的过程中所用到的知识点,在这里我就大概的介绍下,隐式启动一个Activity需要我们的Intent能够匹配待启动Activity的IntentFilter中所设置的过滤信息,如果与之不匹配则无法启动该Activity。IntentFilter中的过滤信息包括action、categoty、data三种,下面我们来具体分析一下

二、匹配action

这是我们的ActivitySummary6在清单中的< activity >代码,注意当不想设置category特定值时,也需要将其设置为android.intent.category.DEFAULT,否则报错

        <activity android:name=".ActivitySummary6">
            <intent-filter>
                <action android:name="zmj.componentssummary.06"/>
                //当不想添加category时,也得添加DEFAULT,否则报错,原因如下
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

我们在ActivitySummary5界面启动上面的ActivitySummary6界面,代码如下

        Intent intent = new Intent();
        intent.setAction("zmj.componentssummary.06");
        startActivity(intent);

当我们没有调用addCategory()方法时,系统会默认调用intent.addCategory(“android.intent.category.DEFAULT”),这也是我们在清单中不加category为什么会报错的原因。当然在清单< activity >中,我们也可以定义多个action值,匹配规则即当我们Intent所携带的action值能与其中一个action值完全相同即可算匹配成功。

三、匹配category

这是我们的ActivitySummary5在清单中的< activity >代码,注意在< intent-filter >标签里,< action > 和 < category >标签需要同时存在,否则会报错

        <activity android:name=".ActivitySummary5">
            <intent-filter>
                //必须存在action,当只有categary时报错
                <action android:name="zmj.componentssummary.05"/>
                //这是我们自己定义的category标签
                <category android:name="zmj.componentssummary.category05"/>
                //DEFAULT这个category标签不能去掉,否则会报错
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

在我们的ActivitySummary6中启动我们的ActivitySummary5,代码如下

        Intent intent = new Intent();
        intent.setAction("zmj.componentssummary.05");
        intent.addCategory("zmj.componentssummary.category05");
        startActivity(intent);

当然我们也可以在清单中添加多个自定义category,匹配规则即如果我们的Intent含有category,那么我们所有的category都必须和过滤规则中的其中一个category相同。

四、匹配data

不同于action和category的字符串格式,data的数据格式稍微有点复杂

        <data
            android:mimeType="媒体类型,例如image/*、image/jpeg、audio/mpeg4-generis、video/*"
            android:scheme="URI的模式,例如http、file、content"
            android:host="主机名,例如www.baidu.com"
            android:port="端口号,例如8080"
            android:path="/完整的路径信息"
            android:pathPattern="完整的路径信息,可以包含通配符"
            android:pathPrefix="/路径的前缀信息"/>

不过其实常用的也很简单,例如这是咱们的ActivitySummary7,需要注意的是,< data >必须和< action >和< category >共同作用,自己不能单独使用,否则会报错

        <activity android:name=".ActivitySummary7">
            <intent-filter>
                <action android:name="zmj.componentssummary.07"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data
                    android:mimeType="image/png"
                   />
            </intent-filter>
        </activity>

这是我们启动ActivitySummary7的代码

        Intent intent = new Intent();
        intent.setAction("zmj.componentssummary.07");
        // 未指定过滤规则中的URI模式,即scheme的值,URI就会取默认值content和file
        intent.setDataAndType(Uri.parse("file://abc"), "image/png");
        startActivity(intent);

还有一点需要注意的是,当我们没有指定过滤规则中的URI模式,即scheme的值时,URI就会取默认值content和file,所以我们启动的时候Intent必须携带URI模式类型才能与之匹配,同时,< data >也支持添加多个,匹配规则即Intent所携带的data必须能够和过滤规则中的其中一个完全匹配

五、总结

本节主要简单介绍了< intent-filter >的匹配规则,如果想要查看更多四大组件的基础知识,去我的博客目录里查看吧,因为关于每块知识点的介绍,博客单节写的比较零散,不容易查找。

猜你喜欢

转载自blog.csdn.net/MingJieZuo/article/details/83115516