您的位置:华清远见教育科技集团 >> Android资料 >> Android开发中Intent属性详解  
 
Android开发中Intent属性详解
分享到:

Intent是一个动作的完整描述,包含了动作的产生组件、接收组件和传递的数据信息。Android则根据Intent的描述,在不同组件间传递消息,负责找到对应的组件,将 Intent传递给调用的组件,组件接收到传递的消息,执行相关动作,完成组件的调用。

Android Intent激活组件不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。Intent为ActivityServiceBroadcastReceiver等组件提供交互能力,还可以启动Activity和Service,在Android系统上发布广播消息。这里的广播消息是指可以接收到的特定数据或消息,也可以是手机的信号变化或电池的电量过低等信息。

因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。在SDK中给出了 Intent作用的表现形式。

·通过Context.startActivity() or Activity.startActivityForResult()启动一个Activity。

·通过 Context.startService() 启动一个服务,或者通过Context.bindService() 和后台服务交互。

·通过广播方法(比如Context.sendBroadcast(),Context.sendOrderedBroadcast(), Context.sendStickyBroadcast())发给broadcast receivers。

·一般情况下,Intent对某操作的抽象描述包含下面几个部分。

·对执行动作的描述:操作(action)。

·对这次动作相关联的数据进行描述:数据(data)。

·对数据类型的描述:数据类型(type)。

·对执行动作的附加信息进行描述:类别(category)。

·其他一切附加信息的描述:附件信息(extras)。

·对目标组件的描述:目标组件(component)。

1、Intent的action属性

action是要执行的动作,也可以是在广播Intent中已发生且正被报告的动作。action部分是一个字符串对象。它描述了Intent会触发的动作。Android系统中已经预定义了一些action常量,可以参看SDK帮助文档,下表给出了一些标准的action常量,如表1所示。

表1 SDK中定义的标准动作

常量 目标组件 描述
ACTION_CALL activity 初始化一个电话呼叫
ACTION_EDIT activity 显示可供用户编辑的数据
ACTION_MAIN activity 将该Activity作为task的第一个Activity ,没有数据输入,也没有数据返回
ACTION_SYNC activity 使服务器上的数据与移动设备上数据同步
ACTION_BATTERY_LOW broadcast receiver 提示电池电量低
ACTION_HEADSET_PLUG broadcast receiver 提示耳机塞入或拔出
ACTION_SCREEN_ON broadcast receiver 屏幕已点亮
ACTION_TIMEZONE_CHANGED broadcast receiver 时区设置改变

注:除了SDK中定义的标准动作外,也可以使用自定义动作。自定义的动作在使用时,一般要加上包名作为前缀(为防止重复定义),如“com.example.project.SHOW_COLOR”,并可定义相应的Activity来处理自定义动作。

除上表介绍的action常量外,开发者也可以定义自己的action描述。一般来讲,定义自己的action字符串应该以应用程序的包名为前缀(防止重复定义)。由于action部分很大程度上决定了一个Intent的内容,特别是数据(data)和附加(extras)字段,就像一个方法名决定了参数和返回值。正是这个原因,应该尽可能明确指定动作,并紧密关联到其他Intent字段。即应该定义组件能够处理的Intent对象的整个协议,而不仅仅是单独地定义一个动作。一个Intent对象的动作通过setAction()方法设置,通过getAction()方法读取。

2、Intent的data属性

data,即执行动作要操作的数据。

data描述了Intent的动作所能操作数据的MIME类型和URL,不同的Action用不同的操作数据。例如,如果Activity字段是ACTION_EDIT,data字段将显示包含用于编辑的文档的URI;如果Activity是ACTION_CALL,data字段是一个tel://URI和将拨打的号码;如果Activity是ACTION_VIEW,data字段是一个//URI,接收活动将被调用去下载和显示URI指向的数据。在许多情况下,数据类型能够从URI中推测出来,特别是content://URIs,它表示位于设备上的数据且被内容提供者(Content Provider)控制。但是类型也能够显示设置,setData()方法指定数据的URI,setType()指定MIME类型,setDataAndType()指定数据的URI和MIME类型。通过getData()读取URI,getType()读取类型。

匹配一个Intent到一个能够处理data的组件,知道data的类型(它的MIME类型)和它的URI很重要。例如,一个组件能够显示图像数据就不应该被调用去播放音频文件。

3、Intent的type属性

数据类型(type),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。

4、Intent的category属性

category(类别),被执行动作的附加信息。例如,LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。其他的如表2所示。

表2 SDK中定义的标准动作

常量 描述
CATEGORY_BROWSABLE 目标Activity可通过浏览器安全启动以显示一个链接相关的数据,如图片或邮件信息
CATEGORY_GADGET Activity可被嵌入另外一个拥有gadget的Activity中
CATEGORY_HOME Activity显示主页,即设备打开时用户看到的第一个界面或是用户按Home键时的界面
CATEGORY_LAUNCHER Activity是一个task的初始Activity,是程序启动的高优先级Activity
CATEGORY_PREFERENCE 目标Activity为preference panel.

通过addCategory()方法添加一个种类到Intent对象中;通过removeCategory()方法删除一个之前添加的种类;通过getCategories()方法获取Intent对象中的所有种类。

5、Intent的extras属性

extras(附加信息)是一组键值对,包含了需要传递给目标组件并有其处理的一些附加信息。

就像动作关联的特定种类的数据URIs,也关联到某些特定的附加信息。例如,一个ACTION_TIMEZONE_CHANGE intent有一个“time-zone”的附加信息,标识新的时区,ACTION_HEADSET_PLUG有一个“state”附加信息,标识头部现在是否塞满或未塞满;有一个“name”附加信息,标识头部的类型。如果你自定义了一个SHOW_COLOR动作,颜色值将可以设置在附加的键值对中。例如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

Intent有一系列putXXX()方法用于插入各种附加数据,有一系列getXXX()方法可以取出一系列数据。

使用Extras可以为组件提供扩展信息。

6、Intent的ComponentName属性

ComponentName(组件),指定Intent的目标组件的类名称。ComponentName包含两个String成员,分别代表组件的全称类名和包名,包名必须和AndroidManifest.xml文件标记中的对应信息一致。ComponentName通过setComponent()、setClass()或setClassName()设置,通过getComponent()读取。

通常 Android会根据Intent 中包含的其他属性的信息(如action、data/type、category)进行查找,终找到一个与之匹配的目标组件。但是,如果ComponentName这个属性有指定,将直接使用指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其他所有属性都是可选的。

对于Intent,组件名并不是必需的。如果一个Intent对象添加了组件名,则称该Intent为“显式Intent”,这样的Intent在传递时会直接根据组件名去寻找目标组件。如果没有添加组件名,则称为“隐式Intent”,Android会根据Intent中的其他信息来确定响应该Intent的组件。

总之,action、data/type、category和extras一起使系统能够理解诸如“查看某联系人的详细信息”或“给某人打电话”之类的短语。随着应用不断地加入系统中,Android系统可以添加新的action、data/type、category来扩展功能。当然,受益的还是应用本身,可以利用这套语言机制来处理不同的动作和数据。

 更多相关文章

·Android Intent激活组件
·Android常用组件生命周期
·Android Broadcast Receivers的使用
·详解Android Service组件
·Android应用组件Activity