美文网首页
IntentFilter的匹配规则

IntentFilter的匹配规则

作者: 闫鹏飞写字的地方 | 来源:发表于2018-10-09 10:01 被阅读7次

我们知道,Activity的启动模式分为两种,分别是显式启动和隐式启动。显式启动需要明确的指定被启动的对象的组件信息,包括包名和类名;而隐式启动需要Intent 能够匹配目标组件的IntentFilter 中所设置的过滤信息(原则上,一个Intent不应该既是显式调用又是隐式调用,如果二者共存,则显示调用为主)。

IntentFilter 中的过滤信息包括 actioncategorydata。为了匹配过滤列表,需要同时匹配过滤列表中的actioncategorydata信息,否则匹配失败。一个Activity中可以有多个IntentFilter,一个Intent只要能匹配任何一组 intent-filter,即可成功启动对应的Activity。以下是一个过滤规则的实例:

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="my.itgungnir.action1" />
        <category android:name="my.itgungnir.category1" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <intent-filter>
        <action android:name="my.itgungnir.action2" />
        <action android:name="my.itgungnir.action3" />
        <category android:name="my.itgungnir.category2" />
        <category android:name="my.itgungnir.category3" />
        <category android:name="my.itgungnir.category4" />
        <data android:mimeType="text/plain" />
        <data android:host="www.baidu.com" />
    </intent-filter>
</activity>

action的匹配规则
  action是一个字符串。action的匹配规则是:Intent中必须有一个action且必须能够和过滤规则中的某个action匹配(这里说的匹配是指字符串值完全一样)。

【注意】

action中的内容是区分大小写的;
Intent中如果没有指定action,则视为匹配失败。

category的匹配规则
  category是一个字符串。category的匹配规则是:Intent中可以没有category,但是如果一旦有category,不管有几个,每个都要能够和过滤规则中的任何一个category匹配。

【注意】:如果想让Activity A隐式启动Activity B,那么需要在Activity Bintent-filter 中指定 android.intent.category.DEFAULT 这个category,原因是系统在调用 startActivity() 或者 startActivityForResult()方法的时候会默认为Intent加上 android.intent.category.DEFAULT 这个category

data的匹配规则
  data的匹配规则:Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个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由两部分组成: mimeTypeURIURI通过如下格式,包括schemehostportpathpathPrefixpathPattern

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
  具体的参数解释如下:

mimeType :指媒体类型,比如 image/jpegaudio/mpeg4-genericvidio/*等,可以表示图片、文本、视频等不同的媒体格式。

schemeURI的模式,如httpfilecontent等,如果URI中没有指定scheme,那么整个URI的其他参数无效,这也意味着URI是无效的。

hostURI的主机名,如www.baidu.com,如果host未指定,那么整个URI中的其他参数无效,这也意味着URI是无效的。

portURI中的端口号,比如80,进档URI中指定了schemehost参数的时候,port参数才是有意义的。

path :表述路径的完整信息。

pathPrefix :表述路径的前缀信息。

pathPattern :表述路径的完整信息,但它里面可以包含通配符*,表示0个或任意字符(如果想要表示真是字符串,则需要转义成\\*\要写成\\\\)。

我们可以通过intent.setDataAndType(Uri.parse("URI字符串"), "mimeType字符串")的格式为Intent设置data

【注意】

URI可以不设置,但如果设置了,则schemehost 属性必须要设置;
URIscheme 属性有默认值,默认值为 content或者 file ,因此,就算在intent-filter中没有为data设置URI,也需要在匹配的时候设置schemehost两个属性,且scheme属性的值必须是content或者file
在为Intent指定data的时候,必须要调用setDataAndType()方法,不能先调用 setData() 再调用 setType(),因为这两个方法会彼此清楚对方的值;
所有有关data的属性可以放在同一个<data>标签中,也可以分作多个<data>标签存放,其效果相同。

总结
1、以下是在JAVA代码中匹配某个Activityintent-filter 的代码:

Intent intent = new Intent();
intent.addAction("my.itgungnir.action1");
intent.addCategory("my.itgungnir.category1");
intent.setDataAndType(Uri.parse("file://abc"), "text/plain");
startActivity(intent);

2、在Menifest文件的<intent-filter>标签中,actioncategorydata都可以有多个;在JAVA代码中,一个Intent中只能有一个action和一个data,可以有多个category

3、我们在通过隐式方式启动一个Activity的时候,可以做以下判断,看有没有Activity能够匹配我们的Intent,具体的判断方法有两种:

(1)使用 PackageManager或者 IntentresolveActivity() 方法,这个方法会返回最佳匹配的Activity信息,如果没有匹配的Activity,则返回null

(2)使用 PackageManagerqueryIntentActivities()方法,这个方法会返回所有成功匹配的Activity的信息。

public abstract ResolveInfo resolveActivity(Intent intent, int flags);
public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags);

需要说明的是这两个方法的第二个参数,我们在使用这两个方法的时候,第二个参数都必须是Intent.MATCH_DEFAULT_ONLY,这个参数用来匹配那些在intent-filter中声明了categoryandroid.intent.category.DEFAULTActivity,避免某些Activity因为没有设置categoryDEFAULT而无法接收隐式Intent

4、如果想将一个Activity标记为应用的入口,可以在其 <intent-filter> 标签中添加如下两行属性(这两行属性必须同时存在才有用,缺一不可):

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

相关文章

  • IntentFilter的匹配规则

    允许转载请注明出处。 IntentFilter的匹配规则 对于初学者来说,学习IntentFilter的匹配规则还...

  • IntentFilter的匹配规则

    IntentFilter的匹配规则 IntentFilter中的过滤信息有action,category,data...

  • IntentFilter匹配规则

  • IntentFilter匹配规则

    首先废话一下,如果要写东西,csdn和简书还是老老实实选简书。不管什么,就冲csdn不会自动保存,简书会自动保存就...

  • IntentFilter匹配规则

    IntentFilter直译过来就是意图过滤器,我们可以通过它的匹配规则去打开我们想要打开的一类Activity,...

  • IntentFilter的匹配规则

    前言 我们知道,启动Activity分为两种,显示调用和隐式调用。这里主要介绍隐式调用的IntentFilter匹...

  • IntentFilter的匹配规则

    启动Activity分为两种,显示调用和隐式调用。显式调用需要明确的指定被启动对象的组件信息,包括包名和类名...

  • IntentFilter的匹配规则

    我们知道,Activity的启动模式分为两种,分别是显式启动和隐式启动。显式启动需要明确的指定被启动的对象的组件信...

  • IntentFilter 的匹配规则

    1. 显示调用与隐式调用   显示调用需要明确指定被启动对象的组件信息,包括类名与包名,隐式调用不需要明确指定组件...

  • IntentFilter的匹配规则

    Activity的隐式调用需要明确指定组件信息。原则一个Intent不应该既是显式又是隐式调用,如果两者共存的话以...

网友评论

      本文标题:IntentFilter的匹配规则

      本文链接:https://www.haomeiwen.com/subject/mvfeaftx.html