本文来自:安卓航班网

       一个应用程序的三个核心组件-活动,服务和广播接收器是通过消息即意图(Intents)来激活的。Intent消息传送是相同或不同应用中组件运行时晚绑定的一种机制。意图本身,一个意图对象,是一个包含被执行操作抽象描述的被动的数据结构-或者,对于广播而言,是某件已经发生并被声明的事情的描述。存在不同的机制来传送意图到每种组件中:

       一个意图对象是传递给Context.startActivity()或者Activity.startActivityForResult()来启动一个活动或者让一个存在的活动去做某些新的事情。

       一个意图对象是传递给Context.startService()来发起一个服务或者递交新的指令给运行中的服务。类似的,一个意图能被传递给Context.bindService() 来在调用组件和一个目标服务之间建立连接。作为一个可选项,它可以发起这个服务如果还没运行的话。

        传递给任意广播方法(例如Context.sendBroadcast(),Context.sendOrderedBroadcast(), 或者Context.sendStickyBroadcast())的意图对象被传递给所有感兴趣的广播接收者。许多种广播产生于系统代码。  
在每个例子里,Android系统找到合适的活动,服务,或者一组广播接收者来回应这个意图,必要时实例化它们。这些消息传送系统没有重叠:广播意图仅被传递给广播接收者,永远不会给活动或者服务。一个传送给startActivity()的意图是只会被传递给一个活动,永远不会给一个服务或广播接收者,如此类推。

       这篇文档以意图对象的描述开始,然后描述Android映射意图到组件的规则-如何解决哪个组件应该接收一个意图消息。对于没有显式命名一个目标组件的意图,这个过程包括对照与潜在目标相关联的意图过滤器来测试这个意图对象。

       意图对象Intent Objects

       一个意图Intent对象是一堆信息。它包含接收这个意图的组件感兴趣的信息(例如将要采取的动作和操作的数据)再加上Android系统感兴趣的信息(例如应该处理这个意图的组件类别和如何启动一个目标活动的指令):
组件名称Component name

       应该处理这个意图的组件名字. 这个字段是一个ComponentName对象- 一个组合物:目标组件的完全合格的类名以及应用程序描述文件中设置的组件所在包的名字(比如, "com.example.project"). 这个组件名字的包部分和描述文件中设置的包名字不一定要匹配。

       组件名字是可选的。如果被设置了,这个意图对象将被传递到指定的类。如果没有, Android使用另外的意图对象中的信息去定位一个合适的目标- 请看本文稍后描述的意图解析Intent Resolution。

       组件名字通过如下方法:setComponent(),setClass(), 或者setClassName()设置并通过getComponent()读取。

动作Action

一个将被执行的动作的字符串命名
-或者, 对于广播意图而言, 是发生并被报告的动作。这个意图类定义了一些动作常量, 包含下面这些:



常量

目标组件

Action



ACTION_CALL

活动

开始一个电话呼叫



ACTION_EDIT

活动

显示数据以给用户编辑



ACTION_MAIN

活动

开始任务的初始活动,没有输入数据也没有输出返回



ACTION_SYNC

活动

同步服务器与移动设备之间的数据



ACTION_BATTERY_LOW

广播接收器

电池低电量警告



ACTION_HEADSET_PLUG

广播接收器

耳机插拔



ACTION_SCREEN_ON

广播接收器

屏幕开启



ACTION_TIMEZONE_CHANGED

广播接收器

时区变化

      通过查看Intent类描述可获得一个通用动作的预定义常量列表。其他动作被定义在Android API的其他地方。你也可以自定义动作字符串来激活应用程序中的组件。那些你所创建的动作字符串应该以应用程序包名作为前缀-例如:"com.example.project.SHOW_COLOR".

      动作很大程度上决定了意图其他部分如何被组织-尤其是数据data和附加字段extras-很像一个方法名决定了一些参数和返回值. 因此, 一个好的想法是使用尽可能具体的动作名并和意图的其他字段紧密联系起来。换句话说,为您的组件能处理的意图对象定义一个整体的协议而不是定义一个孤立的动作。
一个意图对象里的动作可以通过setAction()方法设置和通过getAction()方法读取.

      数据Data

      想要操作的数据统一资源标识符(URI)和那种数据的多用途互联网邮件扩展(MIME). 不同的动作伴随着不同种类的数据规格。例如,如果动作是ACTION_EDIT,数据字段会包含可编辑文档的URI;如果动作是ACTION_CALL,数据字段会是一个电话号码:含呼叫电话号码的URI;类似的,如果动作是ACTION_VIEW而且数据字段是一个http:URI, 那么接收到的活动将会是下载并显示URI所引用数据的请求。当匹配一个意图到一个能处理数据的组件时,除了它的URI外,通常需要知道数据类型(它的MIME类型)。
比如,一个能显示图片的组件不应该被要求去播放一个声音文件。

      在很多情况下,这个数据类型可以从URI里推断出来-尤其是content:URIs, 这意味着数据被存放在设备上而且由一个内容提供者控制着。但类型可以在意图对象里显示的设置。setData()方法指定数据只能为一个URI,setType()指定它只能是一个MIME类型, 而setDataAndType()指定它同时为URI和MIME类型。URI通过getData()读取,类型则通过getType().

目录Category

一个包含关于应该处理这个意图的组件的附加信息的字符串。任意数目的类别描述可以被放到一个意图对象里。和动作一样,意图类定义若干类别常量,包含如下这些:

常量

含义



CATEGORY_BROWSABLE

目标活动可以被浏览器安全的唤起来显示被一个链接所引用的数据
-比如,一张图片或一条e-mail消息。



CATEGORY_GADGET

这个活动可以被嵌入到充当配件宿主的另外的活动里面。



CATEGORY_HOME

这个活动将显示桌面,也就是用户开机后看到的第一个屏幕或者按HOME键时看到的屏幕。



CATEGORY_LAUNCHER

这个活动可以是一个任务的初始活动并被列在应用程序启动器的顶层。



CATEGORY_PREFERENCE

目标活动是一个选择面板。

原文地址:http://www.apkway.com/forum.php?mod=viewthread&tid=1231&extra=page%3D2

posted on 2011-07-09 21:25  泉と緣  阅读(230)  评论(0编辑  收藏  举报