我是靠谱客的博主 时尚鸭子,最近开发中收集的这篇文章主要介绍IntentFilter的匹配规则IntentFilter的匹配规则判断隐式Intent所启动的Activity是否存在,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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是否存在所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部