资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
作者:吴秦引言引言大部分移动设备平台上的应用程序都运行在他们自己的沙盒中。他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互。 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义!Android 应用程序也是一个沙盒,但是他们能够使用 Intent、Broadcast Receivers、Adapters、Content Providers、Internet 去突破他们的边界互相交流。有交流还会和谐,由此可见这些交流手段有多重要。上篇文章中我们在 SMS 接收程序和使用 Intent 发送 SMS 程序中用到了 Intent,并做了简单的回顾和总结:android 应用程序的三大组件Activities、Services、Broadcast Receiver,通过消息触发,这个消息就称作意图(Intent)。然后以活动为例简单介绍了Intent 了并说明 Intent 机制的好处。既然在 SMS 程序中用到了 Intent,这里我就借机顺着这条线,彻底详细地介绍一下 Intent。分两篇文章介绍:1.Android 开发之旅: Intents 和 Intent Filters(理论部分)2.Android 开发之旅: Intents 和 Intent Filters(实例部分)本文的主要内容如下:1、概述、概述2、Intent 对象对象o2.1、组件名字、组件名字o2.2、动作、动作o2.3、数据、数据o2.4、种类、种类o2.5、附加信息、附加信息o2.6、标志、标志3、Intent 解析解析o3.1、Intent 过滤器过滤器3.1.1、动作检测、动作检测3.1.2、种类检测、种类检测3.1.3、数据检测、数据检测o3.2、通用情况、通用情况o3.3、使用、使用 intent 匹配匹配1、概述、概述一个应用程序的三个核心组件activities、services、broadcast receivers,都是通过叫做 intents 的消息激活。Intent 消息是一种同一或不同应用程序中的组件之间延迟运行时绑定的机制。intent 本身(是一个 Intent 对象),是一个被动的数据结构保存一个将要执行的操作的抽象描述,或在广播的情况下,通常是某事已经发生且正在宣告。对于这三种组件,有独立的传送 intent 的机制:Activity:一个 intent 对象传递给 Context.startActivity()或Activity.startActivityForRestult()去启动一个活动或使一个已存在的活动去做新的事情。Service:一个 intent 对象传递给 Context.startService()去初始化一个 service 或传递一个新的指令给正在运行的 service。类似的,一个 intent 可以传递给Context.bindService()去建立调用组件和目标服务之间的连接。Broadcast Receiver:一个 intent 对象传递给任何广播方法(如Context.sendBroadcast(),Context.sendOrderedBroadcast(),Context.sendStickyBroadcast()),都将传递到所有感兴趣的广播接收者。在每种情况下,Android 系统查找合适的 activity、service、broadcast receivers 来响应意图,如果有必要的话,初始化他们。这些消息系统之间没有重叠,即广播意图仅会传递给广播接收者,而不会传递活动或服务,反之亦然。下面首先描述 intent 对象,然后介绍 Android 将 intent 映射到相应组件的规则如何解决哪个组件应该接收 intent 消息。对于没有指定目标组件名字的 intent,这个处理过程包括按照 intent filters 匹配每个潜在的目标对象。2、Intent 对象对象一个 Intent 对象是一个捆信息,包含对 intent 有兴趣的组件的信息(如要执行的动作和要作用的数据)、Android 系统有兴趣的信息(如处理 intent 组件的分类信息和如何启动目标活动的指令)。下面列出它的主要信息:2.1、组件名字、组件名字处理 intent 的组件的名字。这个字段是一个 ComponentName 对象是目标组件的完全限定类名(如“com.example.project.app.FreneticActivity“)和应用程序所在的包在清单文件中的名字(如“com.example.project“)的组合。其中组件名字中的包部分不必一定和清单文件中的包名一样。组件名字是可选的,如果设置了,intent 对象传递到指定类的实例;如果没有设置,Android 使用 intent 中的其它信息来定位合适的目标组件(见下面的 Intent 解析)。组件的名字通过 setComponent(),setClass()或 setClassName()设置,通过 getComponent()读取。2.2、动作、动作一个字符串命名的动作将被执行,或在广播 intent 中,已发生动作且正被报告。Intent 类定义了一些动作常量,如下:ConstantConstantTargetTarget componentcomponentActionActionACTION_CALLactivityInitiate a phone call.ACTION_EDITactivityDisplay data for the user to edit.ACTION_MAINactivityStart up as the initial activity of a task, with no data input and no returned output.ACTION_SYNCactivitySynchronize data on a server with data on the mobile device.ACTION_BATTERY_LOWbroadcast receiverA warning that the battery is low.ACTION_HEADSET_PLUGbroadcast receiverA headset has been plugged into the device, or unplugged from it.ACTION_SCREEN_ONbroadcast receiverThe screen has been turned on.ACTION_TIMEZONE_CHANGED broadcast receiverThe setting for the time zone has changed.查看更多的动作请参考 Intent 类。其它的动作定义在 Android API 中,我们还可以定义自己的动作字符串一再我们的应用程序中激活组件。自定义动作字符串应该包含应用程序报名前缀,如“com.example.project.SHOW_COLOR“。动作很大程度上决定了剩下的 intent 如何构建,特别是数据(data)和附加(extras)字段,就像一个方法名决定了参数和返回值。正是这个原因,应该尽可能明确指定动作,并紧密关联到其它 intent 字段。换句话说,应该定义你的组件能够处理的 Intent 对象的整个协议,而不仅仅是单独地定义一个动作。一个 intent 对象的动作通过 setAction()方法设置,通过 getAction()方法读取。2.3、数据、数据数据(data)是将作用于其上的数据的 URI 和数据的 MIME 类型。不同的动作有不同的数据规格。例如,如果动作字段是 ACTION_EDIT,数据字段将包含将显示用于编辑的文档的 URI;如果动作是 ACTION_CALL,数据字段将是一个 tel:URI 和将拨打的号码;如果动作是 ACTION_VIEW,数据字段是一个 http:URI,接收活动将被调用去下载和显示URI 指向的数据。当匹配一个 intent 到一个能够处理数据的组件,通常知道数据的类型(它的 MIME 类型)和它的 URI 很重要。例如,一个组件能够显示图像数据,不应该被调用去播放一个音频文件。在许多情况下,数据类型能够从 URI 中推测,特别是 content:URIs,它表示位于设备上的数据且被内容提供者(content provider)控制。但是类型也能够显示地设置,setData()方法指定数据的 URI,setType()指定 MIME 类型,setDataAndType()指定数据的 URI 和MIME 类型。通过 getData()读取 URI,getType()读取类型。2.4、种类、种类此外,还包含关于应该处理 intent 的组件类型信息。可以在一个 Intent 对象中指定任意数量的种类描述。Intent 类定义的一些种类常量,如下这些:ConstantConstantMeaningMeaningCATEGORY_BROWSABLEThe target activity can be safely invoked by the browser to display data referenced by a link for example, an image or an e-mail message.CATEGORY_GADGETThe activity can be embedded inside of another activity that hosts gadgets.CATEGORY_HOMEThe activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.CATEGORY_LAUNCHERThe activity can be the initial activity of a task and is listed in the top-level application launcher.CATEGORY_PREFERENCE The target activity is a preference panel.更多的种类常量请参考 Intent 类。addCategory()方法添加一个种类到 Intent 对象中,removeCategory()方法删除一个之前添加的种类,getCategories()方法获取 Intent 对象中的所有种类。2.5、附加信息、附加信息额外的键值对信息应该传递到组件处理 intent。就像动作关联的特定种类的数据 URIs,也关联到某些特定的附加信息。例如,一个 ACTION_TIMEZONE_CHANGE intent 有一个“time-zone“的附加信息,标识新的时区,ACTION_HEADSET_PLUG 有一个“state“附加信息,标识头部现在是否塞满或未塞满;有一个“name“附加信息,标识头部的类型。如果你自定义了一个 SHOW_COLOR 动作,颜色值将可以设置在附加的键值对中。Intent 对象有一系列的 put()方法用于插入各种附加数据和一系列的 get()用于读取数据。这些方法与 Bundle 对象的方法类似,实际上,附加信息可以作为一个 Bundle 使用putExtras()和 getExtras()安装和读取。2.6、标志、标志有各种各样的标志,许多指示 Android 系统如何去启动一个活动(例如,活动应该属于那个任务)和启动之后如何对待它(例如,它是否属于最近的活动列表)。所有这些标志都定义在 Intent 类中。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号