Android基础之Intent和Intent Filter

时间:2021-03-25 15:34:35

Android应用程序中的三种其他应用程序基本组件——Activity, Service和Broadcast Receiver,都是使用称为intent的消息来”激活”的。

使用Context.startActivity() 或 Activity.startActivityForResult(), 传入一个intent来启动一个Activity. 使用 Activity.setResult(), 传入一个intent来从Activity中返回结果.


将intent对象传给Context.startService()来启动一个Service或者传消息给一个运行的Service. 将intent对象传给 Context.bindService()来绑定一个Service.


将intent对象传给 Context.sendBroadcast(), Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给 Broadcast Receiver.


1.Intent
Intent代表了Android应用的启动”意图”,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,则取决于Intent的各个属性。

Intent具有Component、Action、Data、Type、Category、Extra及Flag七大属性。
(1)Component
组件名称用于标识唯一的应用程序组件,即指明了期望的Intent组件,这种对象的名称是由目标组件的类名与目标组件的包名组合而成的。在Intent传递过程中,组件名称是一个可选项,当指定它时,便是显式的Intent消息,我们称为“显示意图”,当不指定它时,Android系统则会根据其他信息及Intent Filter的过滤条件选择相应的组件,我们称之为“隐式意图”。

(2)Action
Action描述了Intent所触发动作的名称,在Intent类中,已经定义好多字符串常量来表示不同的Action,当然,开发人员也可以自定义Action,但是动作名必须是独一无二的字符串。它通过setAction()方法或在清单文件AndroidManifest.xml中设置。

常见的Android系统自带的Action常量:

ACTION_CALL,拨出Data里封装的电话号码。
ACTION_DIAL:打开系统默认的拨号程序,如果Data中设置了电话号码,则自动在拨号程序中输入此号码。
ACTION_ANSWER:接听来电。
ACTION_SEND:由用户指定发送方式进行数据发送操作。
ACTION_EDIT,打开Data里指定数据所对应的编码程序。
ACTION_VIEW,打开能够显示Data中封装的数据的应用程序。
ACTION_MAIN,声明程序的入口,该Action并不会接收任何数据,同时结束后也不会返回任何数据。
ACTION_BOOT_COMPLETED,BroadcastReceiver Action的常量,表明系统启动完毕。
ACTION_TIME_CHANGED,BroadcastReceiver Action的常量,表示系统时间通过设置而改变。

(3)Data
Intent的Data属性主要描述Intent执行动作的URI和MIME类型,不同类型的Action有不同的Data数据指定。它通过setData()方法设置。

常用格式:
tel://:号码数据格式,后跟电话号码。
mailto://:邮件数据格式,后跟邮件收件人地址。
smsto://:短息数据格式,后跟短信接收号码。
content://:内容数据格式,后跟需要读取的内容。
file://:文件数据格式,后跟文件路径。
http://:网站url数据格式,后接网站地址。

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

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

(5)Category
Intent中的Category属性用于指定当前动作(Action)被执行的环境。
与Category相关的方法有三个,addCategory()添加一个Category,removeCategory()删除一个Category,而getCategories()得到一个Category。

常见的Category常量:

CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。
CATEGORY_HOME:设置该组件为Home Activity。
CATEGORY_PREFERENCE:设置该组件为Preference。
CATEGORY_LAUNCHER:设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用。
CATEGORY_BROWSABLE:设置该组件可以使用浏览器启动。
CATEGORY_GADGET:设置该组件可以内嵌到另外的Activity中。

(6)Extra
Intent的Extra属性是添加一些组件的附加信息,这些信息是以键值对的形式存在的。Intent可以通过putExtras()与getExtras()方法来存储和获取Extra。

常用的Extra键值:

EXTRA_BCC,装有邮件密送地址的字符串数组。
EXTRA_EMAIL,装有邮件发送地址的字符串数组。
EXTRA_UID,使用ACTION_UID_REMOVED动作时,描述删除用户的id。
EXTRA_TEXT,当使用ACTION_SEND动作时,描述要发送文本的信息。
EXTRA_KEY_EVENT:以KeyEvent对象方式存放触发Intent的按键。
EXTRA_PHONE_NUMBER:存放调用ACTION_CALL时的电话号码。

(7)Flag
一些有关系统如何启动组件的标志位。

2.IntentFilter
IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。

IntentFilter中具有和Intent对应的用于过滤Action,Data和Category的字段,一个隐式Intent要想被一个组件处理,必须通过这三个环节的检查。

(1)检查Action
一个Intent只能设置一种Action,但是一个IntentFilter却可以设置多个Action过滤。当IntentFilter设置了多个Action时,只需一个满足即可完成Action验证。当IntentFilter中没有说明任何一个Action时,那么任何的Action都不会与之匹配。而如果Intent中没有包含任何Action,那么只要IntentFilter中含有Action时,便会匹配成功。

(2)检查Data
数据的监测主要包含两部分,即数据的URI及数据类型,而数据URI又被分成三部分进行匹配(scheme、authority、path),只有这些全部匹配时,Data的验证才会成功。

(3)检查Category
IntentFilter同样可以设置多个Category,当Intent中的Category与IntentFilter中的一个Category完全匹配时,便会通过Category的检查,而其他的Category并不受影响。但是当IntentFilter没有设置Category时,只能与没有设置Category的Intent相匹配。