Intent、IntentFilter的匹配规则

1、Intent的概念:

Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。

Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。

activity、service和broadcast receiver之间是通过Intent进行通信的,而另外一个组件Content Provider本身就是一种通信机制,不需要通过Intent。

二、Intent的相关属性:

Intent由以下各个组成部分:

component(组件):目的组件

action(动作):用来表现意图的行动

category(类别):用来表现动作的类别

data(数据):表示与动作要操纵的数据

type(数据类型):对于data范例的描写

extras(扩展信息):扩展信息

Flags(标志位):期望这个意图的运行模式

Intent类型分为显式Intent(直接类型)、隐式Intent(间接类型)。官方建议使用隐式Intent。上述属性中,component属性为直接类型,其他均为间接类型。

三、intent的相关应用

1、component(组件):目的组件

Component属性明确指定Intent的目标组件的类名称。(属于直接Intent)

如果 component这个属性有指定的话,将直接使用它指定的组件。指定了这个属性以后,Intent的其它所有属性都是可选的。

2、Action(动作):用来表现意图的行动

Intent中,Action就是描述做、写等动作的,当你指明了一个Action,执行者就会依照这个动作的指示,接受相关输入,表现对应行为,产生符合的输出。在Intent类中,定义了一批量的动作,比如ACTION_VIEW,ACTION_PICK等, 基本涵盖了常用动作。加的动作越多,越精确。

Action 是一个用户定义的字符串,用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个 Action。action的匹配规则是Intent中的action必须能和过滤规则中的action匹配,一个过滤规则中可以有多个action,那么只有intent中的action能和过滤规则中的任何一个action相同即可匹配成功。

3、category(类别):用来表现动作的类别,category的匹配规则和action不同,它要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中以一个category相同。换句话说Intent中不管出现几个category,对于每一个category来说,他必须是过滤规则中已经定义的category。

4、data(数据):表示与动作要操纵的数据

Data属性是Android要访问的数据,和action和Category声明方式相同,也是在IntentFilter中。

多个组件匹配成功显示优先级高的; 相同显示列表。

date的匹配规则和action类似,如果过滤规则里面定义了data,那么Intent中必须也要定义与之匹配的data。data一般情况有两部分组成,mimeType和URI。mimeType指媒体类型,比如说image/jpeg和video/*等,可以表示图片、文本、视频等不同的媒体格式,而Uri中包含的数据就比较多了。uri的结构为://:/[||]

Scheme:URI的模式,比如http、file、content等,如果URI中没有指定Scheme,那么整个URI的其他参数无效,这也意味着URI是无效的。

Host:URI的主机名,比如说www.baidu.com,如果host未指定,那么整个URI中的其他参数也是无效的。

Port:URI中的端口号,比如说80,仅当URI中指定了scheme和host参数的时候port参数才有意思。

Path、pathPattern和pathPrefix:这三个参数表述路径信息,其中path表示完整的路径信息;pathPattern也表示完整的路径信息,但它里面可以包含通配符“*”,“*”表示0个或多个任意的字符,需要注意的是,由于正则表达式所以“*”要写成“\\*”,"\"要写成“\\\\”;pathPrefix表示路径的前缀信息。

5、type(数据类型):对于data范例的描写

如果Intent对象中既包含Uri又包含Type,那么,在中也必须二者都包含才能通过测试。

Type属性用于明确指定Data属性的数据类型或MIME类型,但是通常来说,当Intent不指定Data属性时,Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。

data和type属性一般只需要一个,通过setData方法会把type属性设置为null,相反设置setType方法会把data设置为null,如果想要两个属性同时设置,要使用Intent.setDataAndType()方法。

6、extras(扩展信息):扩展信息

是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个

动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

7、Flags(标志位):期望这个意图的运行模式

一个程序启动后系统会为这个程序分配一个task供其使用,另外同一个task里面可以拥有不同应用程序的activity。那么,同一个程序能不能拥有多个task?这就涉及到加载activity的启动模式,这个需要单独讲一下。

注:android中一组逻辑上在一起的activity被叫做task,自己认为可以理解成一个activity堆栈。

你可能感兴趣的:(Intent、IntentFilter的匹配规则)