概述
我们知道,启动Activity分为隐式调用和显示调用两种方式。显示调用必须明确指定被调用对象的组件信息,包括包名和类名,这种调用很简单,我们着重来说下隐式调用。
隐式调用不需明确指定被调用对象的组件信息,开启时需要给inten指定明确的匹配信息,intent要能够匹配目标组件在intentFilter中设置的匹配信息,如果匹配失败,那就无法启动目标组件。
IntentFilter中的过滤信息包括:action,category,data
,intent只有将这三项全部匹配成功,才算真正的匹配成功。接下来我们分别介绍下这三项的详细匹配规则。
1. action的匹配规则
action是一个字符串,系统为我们预置了一些action,我们也可以在IntentFilter中配置自己的action,可以配置单个或者多个。只要intent的action与IntentFilter中的任何一个action匹配上了(字符串完全一样,区分大小写),那就算匹配成功。这里需要强调下,intent中必须设置action,否则匹配失败。
2. category的匹配规则
category
是一个字符串,系统为我们预置了一些category
,我们也可以在IntentFilter中配置自己的category
,可以配置单个或者多个。category
与action
的匹配规则有些不同:
① 如果intent中设置了category
,那么设置的category
必须是在IntentFilter中已经配置的,换句话说,只要intent中设置的category
与IntentFilter中配置的多个category
中的任意一个匹配上了就算匹配成功,否则匹配失败。从这个匹配规则来看,与action
是相同的。
② 如果intent中没有设置category
,那么匹配也是可以成功的,因为系统会为intent添加一个默认的category,android.intent.category.DEFAULT
,对应intentFilter中的:
<category android:name="android.intent.category.DEFAULT" />
这里需要注意一点,intentFilter中必须配置这一默认项,否则这个组件将不会接受默认category
的隐式调用。说到底,还是得遵循①规则,只是系统会给我们添加默认值,并不代表intent里面就不需要category
。
3. data的匹配规则
data
的匹配规则与action
相似,如果intenrFilter中配置了data
,那么必须要在在intent中设置data
, 在intent中设置的data
,必须是在intentFilter中设置过的。换句话说,data不是匹配时必须存在的信息。data的结构由:mimeType
和URI
两部分组成。
mimeType
:指媒体类型,比如image/jpeg,audio/mpeg4-generic,video/*
等。
URI
:包含的信息有:scheme,host,port,pathPattern
,例:http://zb.com:80/mian/info
。scheme
是uri的模式,比如http,file,content等,如果没有指定scheme
,则整个uri的其他参数无效,意味着uri无效。host
是uri的主机名,如果host
未指定,则整个uri的其他参数无效,意味着uri无效。port
是uri端口号,仅当scheme
和host
存在才有意义。pathPattern
表述路径信息,里面可以包含*
通配符,表示0个或多个任意字符。
需要主要的一点是:mimeType
必须在intentFilter的data
中配置,但是URI
可以不用配置,有默认值:file,content
。
例:
<intent-filter>
<data
android:mimeType="image/*"
/>
</>
我们根据intentFilter中的data配置,可以给出:
intent.setDataAndType(Uri.parse("file://zb"),"image/png")
另外,要为intent设置完整的data,必须调用setDataAndType
,不能先后调用setData
,setType
,因为后面的会把前面设置的覆盖掉。
最后我们给出一个例子,把这三种匹配规则应用一下:
<intent-filter>
<action android:name="com.zb.action.test1" />
<action android:name="com.zb.action.test2"/>
<category android:name="com.zb.category.test1"/>
<category android:name="com.zb.category.test2"/>
<category android:name="android.intent.category.DEFAULT"/>
<data
android:scheme="http"
android:host="zb"
android:mimeType="image/*"
/>
</intent-filter>
Intent intent = new Intent();
//或者intent.setAction("com.zb.action.test1");
intent.setAction("com.zb.action.test2");
//可以不设置category,采用默认的
intent.addCategory("com.zb.category.test1");
intent.addCategory("com.zb.category.test1");
intent.setDataAndType(Uri.parse("http://zb"),"image/png");
最后
以上就是高挑篮球为你收集整理的浅谈Intent匹配规则的全部内容,希望文章能够帮你解决浅谈Intent匹配规则所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复