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>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
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堆栈。