概述
启动 Activity 分为两种,显示调用和隐式调用。
- 显示调用需要明确地指定被启动对象的组件信息,包括包名和类名。
- 隐式调用需要 Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息,如果不匹配将无法启动 Activity。
IntentFilter 中的过滤信息有 action、category、data。
介绍各个属性的匹配规则:
1.action 是一个字符串,系统预定义了一些 action,同时我们也可以在应用中定义自己的 action。action 的匹配要求 Intent 中的 action 存在且必须和过滤规则中的其中一个 action 相同,这里需要注意它和 category 匹配规则不同。另外 action 区分大小写,大小写不同字符串相同的 action 会匹配失败。
2.category 是一个字符串,系统预定义了一些 category,同时我们也可以在应用中定义自己的 category。category的匹配要求 Intent 中可以没有 category,但是如果有 category,不管有几个,每个都要能够和过滤规则中的任何一个 category 相同。
为什么 Intent 不设置 category 也可以匹配呢?
原因是系统在调用 startActivity 或者 startActivityForResult 的时候会默认为 Intent 加上 “android.intent.category.DEFAULT” 这个 category,同时为了我们的 activity 能够接收隐式调用,就必须在 intent-filter 中指定 “android.intent.category.DEFAULT” 这个 category。
3.首先介绍一下 data 的数据格式
data 的语法如下:
data 由两部分组成,mimeType 和 URI。mimeType 指媒体类型,比如 image/jpeg、audio/mpeg4-generic 和 video/*等,可以表示图片、文本、视频等不同的媒体格式,而 URI 中包含的数据比较多,下面是 URI 的结构:
<schme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
举几个实际的例子:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
下面介绍每一个数据的含义:
介绍 data 的匹配规则:
data 的匹配规则和 action 类似,它也要求 Intent 中必须含有 data 数据,并且 data 数据能够完全匹配过滤规则中的某一个 data。这里的完全匹配是指过滤规则中出现的 data 部分也出现在 Intent 中的 data 中。
示例1:
<intent-filter>
<data android:mimeType="image/*" />
...
</intent-filter>
这种规则指定媒体类型为所有类型的图片,因此 Intent 中的 mimeType 属性必须为 “image/*
” 才能匹配。
需要注意的是:这里并没有指定 URI,但是却有默认值,URI 的默认值为 content 和 file。 为了匹配上述规则,Intent 可以这样写:
intent.setDataAndType(Uri.parse("file://abc"), "image/png");
intent.setDataAndType(Uri.parse("content://abc"), "image/jpg");
为什么这里调用 setDataAndType 方法而不是先调用 setData 再调用 setType,因为这两个方法彼此会清除对方的值,源码如下:
public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}
public Intent setType(String type) {
mData = null;
mType = type;
return this;
}
setData 会把 mimeType 置为 null,setType 也会把 URI 置为 null。
示例2:
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" ... />
<data android:mimeType="audio/mpeg" android:scheme="http" ... />
</intent-filter>
为了匹配上述规则,Intent 可以这样写:
intent.setDataAndType(Uri.parse("http://abc"), "video/mpeg");
intent.setDataAndType(Uri.parse("http://abc"), "audio/mpeg");
另外一点,IntentFilter 的匹配规则对于 Service 和 BroadcastReceiver 也是同样的道理,不过系统对于 Service 的建议是尽量使用显示调用来启动服务。
判断是否有 Activity 能够匹配我们的 Intent
最后
以上就是火星上钥匙为你收集整理的IntentFilter的匹配规则--艺术探索的全部内容,希望文章能够帮你解决IntentFilter的匹配规则--艺术探索所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复