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

  IntentFilter 中的过滤信息包括 action、category 和 data。为了匹配过滤列表,需要同时匹配过滤列表中的action、category和data信息,否则匹配失败。一个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 B的 intent-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由两部分组成: mimeType 和 URI ,URI通过如下格式,包括scheme、host、port、path、pathPrefix和pathPattern。

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

  具体的参数解释如下:

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

   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 :表述路径的完整信息。

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

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

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

  【注意】

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

总结

1、以下是在JAVA代码中匹配某个Activity的 intent-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>标签中,action、category和data都可以有多个;在JAVA代码中,一个Intent中只能有一个action和一个data,可以有多个category。

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

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

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

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

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

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

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

【Android - 组件】之IntentFilter的匹配规则的更多相关文章

  1. Android开发——IntentFilter的匹配规则

    1.  IntentFilter中的过滤信息 启动Activity分为显式调用和隐式调用,前者没什么好讲的,后者需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息.包括act ...

  2. Android中的Intent Filter匹配规则介绍

    本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家: ) 1. Intent简介 Intent用于在一个组件(Component,如Activity ...

  3. 05-IntentFilter的匹配规则

    IntentFilter的匹配规则 原则上一个Intent不应该既是显示调用又是隐式调用,如果二者共存的话以显式调用为主 隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过 ...

  4. 《Android开发艺术探索》读书笔记之IntentFillter的匹配规则

    使用intent启动不同组件的方法 组件类型 启动方法 Activity startActivity(Intent intent) startActivityForResult(Intent inte ...

  5. Android组件的通讯——Intent

    转载:Android组件的通讯-Intent 1.概述 一个应用程序的三个核心组件——activities.services.broadcast receivers,都是通过叫做intents的消息激 ...

  6. android 组件使用()

    程序入口点 类似于win32程序里的WinMain函数,Android自然也有它的程序入口点.它通过在AndroidManifest.xml文件中配置来指明,可以看到名为NotesList的activ ...

  7. Android DevArt4:IntentFilter学习及深入~问题描述:在不指定具体action前提下,如果有两个以上的Activity,具有完全相同的intent-filter,项目同步是否会出现异常?程序运行是否会崩溃?

    概述:GitHub IntentFilter意图过滤器,三种匹配规则:action.category.data 重点:过滤规则中必须设置 '<category android:name=&quo ...

  8. Intent 匹配规则

    1.在AndroidManifest.xml中可以为 每个 Activity,Service 设置多个Intent-Filter; 在系统启动和程序安装之后,android会收集AndroidMani ...

  9. Android组件系列----ContentProvider内容提供者

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. 从java到python

    从java到python 从事java开发主要是web方向,这个方向已经相当成熟,基本你想开发什么样的app,总能百度出来相关的项目或者github中搜索到,你需要做的就是掌握调试的技巧,基本你能想到 ...

  2. Docker应用部署

    MySQL: #拉取mysql镜像 docker pull centos/mysql--centos7 #创建容器 #-p 端口映射 -e添加环境变量MYSQL_ROOT_PASSWORD 是root ...

  3. SAP SOAMANAGER报错原因与故障排除方法

    一些刚刚接触到SAP Webservice的开发者由于对SAP Netweaver组件的不熟悉,往往在使用事物码SOAMANAGER进行webservice配置的时候,发现无法正常启动SOAMANAG ...

  4. 关于多线程start()方法原理解读

    1.为什么启动线程不用run()方法而是使用start()方法 run()方法只是一个类中的普通方法,调用run方法跟调用普通方法一样 而start()是创建线程等一系列工作,然后自己调用run里面的 ...

  5. [考试反思]1023csp-s模拟测试83:等候

    分数倒是依旧那么烂,但是这个时间比较诡异. 6分49秒弄出T1,15分钟送上T2的50分暴力,不到一小时半的时候T3的30分暴力也完成了... 在85分钟之后一次提交也没有 前15分钟平均每分钟得10 ...

  6. 模拟80(a)

    其实隔壁的那套题比这套难的多....一道都不会.. T1 题目中已经给出了递推公式,那么这题就没什么了,直接矩阵乘就完了. 然而考场上并没有看出矩阵,主要是用了好久发明crt,我知道原理,但是不会打了 ...

  7. python基础-函数作用域

    函数 函数对象 函数是第一类对象 函数名可以被引用 函数名可以当作参数使用 函数名可以当作返回值使用 函数名可以当作容器类型的元素 函数嵌套 嵌套调用:在函数内部中调用函数 嵌套定义:在函数内部中定义 ...

  8. python——多线程

    多线程特点: • 线程的并发是利用cpu上下文的切换(是并发,不是并行) • 多线程执行的顺序是无序的 • 多线程共享全局变量 • 线程是继承在进程里的,没有进程就没有线程 • GIL全局解释器锁 • ...

  9. Angular前端优化思路

    简单总结接下我这边angular前端优化步骤都是满满的干货,各位客官有好的改进欢迎留言~ 1. 动静分离 项目里面前端比较占用带宽的一般都是加载静态资源,请求后台接口一般占用带宽都是1kb左右,但是在 ...

  10. 还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下

    Java 8 新特性系列文章索引. Jdk14都要出了,还不能使用 Optional优雅的处理空指针? Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下? 还看不懂同事的代码?Lambda ...