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