概述
IntentFilter的匹配规则
启动Activity分为显式调用和隐式调用。隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息。IntentFilter中的过滤信息有action,category,data。一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter,即可成功启动对应的Activity。
action的匹配规则
action的匹配规则是Intent中的action必须能够和过滤规则中的action匹配,这里说的匹配指的就是action的字符串值完全一样。一个过滤规则中可以有多个action,那么只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。
注:如果Intent中没有指定action,那么匹配失败,另外action区分大小写,大小写不同字符串相同的action会匹配失败
category的匹配规则
category的匹配规则和action不同,它要求Intent中如果含有category,那么所有的category都必须和过滤规则中的一个category相同。而且,Intent中可以没有category,如果没有category的话,这个Intent仍然可以匹配成功。
注:它和action匹配过程中的不同,action是要求Intent中必须有一个action且必须能够和过滤规则中的某个action相同;而category要求Intent可以没有category,但是如果你一旦有category,不管有几个,每个都要能够和过滤规则中的任何一个category相同
data的匹配规则
data的匹配规则和action类似,如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data。
我们先了解一下data的语法:
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string" />
其实data由两部分组成,分别是mimeType和URI。mimeType指的是媒体类型,比如image/jpeg、audio/mpeg4-generic和video/*等,可以表示图片、文本、视频等不同的媒体格式,而URI中包含的数据就比较多了,我们再看看URI的结构:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
给两个例子就比较好理解了:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
下列是URI中每个数据的含义:
Scheme:URI的模式,比如http、file、content等,如果URI中没有指定scheme,那么整个URI的其他参数无效,这也意味着URI是无效的。
Host:URI的主机名,比如www.baidu.com,如果host未指定,那么整个URI中的其他参数无效,这也意味着URI是无效的。
Port:URI中的端口号,比如80,仅当URI中指定了scheme和host参数的时候port参数才是有意义的。
Path、pathPattern和pathPrefix:这三个参数表述路径信息,其中path表示完整的路径信息;pathPattern也表示完整的路径信息,但是它里面可以包含通配符“ * ”,“ * ”表示0个或多个任意字符,需要注意的是,由于正则表达式的规范,如果想表示真实的字符串,那么“ * ”要写成“*”;pathPrefix表示路径的前缀信息。
data的匹配规则:和action类似,并且data数据能够完全匹配过滤规则中的某一个data,这里说的完全匹配是指过滤规则中出现的data部分也出现在了Intent中的data中。
举个例子说明一下吧!
(1)
<intent-filter>
<data android:mimeType="image/*" />
</intent-filter>
上述规则指定了媒体类型为所有类型的图片,那么Intent中的mimeType属性必须为“image/*”才能匹配,这种情况下虽然过滤规则没有指定URI,但是却有默认值,URI默认值为content和file,也就是说,虽然没有指定URI,但是Intent中的URI部分的scheme必须为content或file才能匹配。
为了匹配上述的规则,我们定义如下intent即可匹配:
Intent intent=new Intent();
intent.setDataAndType(Uri.parse("file://xxx"),"image/png");
注意:如果要为Intent指定完整的data,必须要调用setDataAndType方法,不能先调用setData再调用setType,因为这两个方法彼此会清除对方的值。
public @NonNull Intent setData(@Nullable Uri data) {
mData = data;
mType = null;//清除type的值
return this;
}
public @NonNull Intent setType(@Nullable String type) {
mData = null;//清除data的值
mType = type;
return this;
}
(2)
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" ... />
<data android:mimeType="audio/mpeg" android:scheme="http" ... />
</intent-filter>
上述规则指定了两组data规则,且每个data都指定了完整的属性值,为了匹配上述的过滤规则,我们可以定义两种方式:
intent.setDataAndType(Uri.parse("http://xxx"),"video/mpeg");
或者
intent.setDataAndType(Uri.parse("http://abc"),"audio/mpeg");
关于data还有一个特殊情况需要进行说明,如下的两种不同的写法,他们的作用却是一样的:
<intent-filter>
<data android:scheme="file" android:host="www.baidu.com" />
</intent-filter>
<intent-filter>
<data android:scheme="file" />
<data android:host="www.baidu.com" />
</intent-filter>
判断隐式Intent所启动的Activity是否存在
当我们通过隐式方式启动一个Activity的时候,可以做一下判断,看是否有Activity能匹配我们的隐式Intent。
1. 采用PackageManager的resolveActivity方法
2. 采用Intent的resolveActivity方法
当它们找不到匹配的Activity都会返回null。
两者的不同:PackageManager提供了queryIntentActivities方法,这个方法和resolveActivity方法不同的是:前者不是返回最佳匹配的Activity信息而是返回所有成功匹配的Activity信息。
下面我们来看一下两种方法原型:
public abstract List<ResolveInfo> queryIntentActivities(Intent intent,int flags);
public abstract ResolveInfo resolveActivity(Intent intent,int flags);
上述两个方法的第二个参数需要注意,我们要使用MATCH_DEFAULT_ONLY这个标记位,这个标记位的含义是仅仅匹配那些在intent-filter中声明了< category android:name="android.intent.category.DEFAULT />这个category的Activity。因为不含有DEFAULT这个category的Activity是无法接收隐式Intent的。
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
相信读者肯定不陌生上述两行代码,这两者的作用是用来表明这个Activity是入口Activity,两者缺一不可,少了任何一个都没有实际意义,也无法出现在应用列表里。
最后
以上就是时尚鸭子为你收集整理的IntentFilter的匹配规则IntentFilter的匹配规则判断隐式Intent所启动的Activity是否存在的全部内容,希望文章能够帮你解决IntentFilter的匹配规则IntentFilter的匹配规则判断隐式Intent所启动的Activity是否存在所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复