概述
有Android开发经验的几乎都知道使用Intent启动新的Activity,显式调用很简单,所以大部分也是使用显式调用,但是更深层次的开发的避不开使用隐式调用。显式调用都很熟悉,这里就重点介绍一下隐式调用。如果两者共存的话,以显式调用为主。此外隐式调用需要Intent能够匹配目标组件的IntentFilter中设置的过滤信息,如果不匹配将无法启动目标Activity,IntentFilter中的过滤信息包括action,category,data。action和category系统都有预定义一些,我们也可以进行自定义。过滤规则往往声明在AndroidMeniFest.xml中的activity中,下面是一个实例:
<activity
......
>
<intent-filter>
<action android:name=”com.example.c”>
<action android:name=”com.example.d”>
<category android:name=”com.example.c”>
<category android:name=”com.example.c”>
<category android:name=”android.intent.category.DEDAULT”>
<data android:mineType=”text/plain”>
</intent-filter>
</activity>
从示例中我们可以看出,一个过滤列表中action,category,data可以有多个,而且一个Activity可以有多组intent-filter,一个Intent只要能匹配任何一组intent-filter即可启动对应的Activity。
下面介绍一下匹配规则:
(1) action的匹配规则
要求Intent中必须有一个action能够和过滤规则中的其中一个action相同即可匹配成功。同时action区分大小写。如果Intent没有制定action则匹配失败。
(2) category的匹配规则
和action不同,如果Intent中含有category,要求所有的category必须在过滤规则中都存在才能匹配成功。如果Intent中没有categoey也可以匹配成功,这是和action的区别。
如果在Intent中设置category可以用intent.addcategory(“......”)。
为什么不设置categoey也可以匹配成功呢,因为系统调用startActivity或者startActivityForResult的时候会默认加上android.intent.category.DEDAULT这个category。为了Activity能够接受隐式调用,我们必须在intent-filter中添加android.intent.category.DEDAULT这个category。
(3) data的匹配规则
data的过滤规则和action是类似的,Intent中必须至少指定一个过滤规则中定义的data。data的结构比较复杂,包括两部分,mimeType和URI。mimeType指媒体类型,比如image/jpge等。URI包含的数据就多了,shame,host,port,path,pathPattern等都是他的组成部分。相信有一定计算机开发经验的已经相当熟悉了。
下面讲一下这两部分是如何匹配的:
比如下面的过滤规则:
<intent-filter>
<data android:mimeType=”image/*” />
.......
<intent-filter>
这种规则指定了媒体类型是所有类型的图片,URI虽然没有指明,但系统却有默认值:http或者file。也就是说对没有指明的URI,Intent中的URI部分的shame必须为http或者file才能匹配,比如下面的就能匹配:
intent.setDataAndType(Uri.prase(“file://abc”),”image/png”);
如果要为intent指定完整的data,必须要用setDataAndType,里面的Data指URI,Type指mimeType。不能先调用setData再调用setType,否则两个方法会彼此清楚对方的值。我们看一下系统的源代码:
public Intent setData(Uri data){
mData=data;
mType=null;
return this;
}
另外一点,Intent-filter的匹配规则对于Service和BroadcastReceiver也是同样的道理。但Service还是尽量采用显式调用来启动服务。
最后
以上就是执着红酒为你收集整理的Android Intent隐式调用之intent-filter匹配规则的全部内容,希望文章能够帮你解决Android Intent隐式调用之intent-filter匹配规则所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复