Android 的Intent 机制

来源:互联网 发布:梦里花落知多少摘抄 编辑:程序博客网 时间:2024/06/06 06:34

         android应用程序有三大组件——Activities、Services、BroadcastReceiver(IntentReceiver),不同的活动(服务,广播接收器)之间的交流即是通过消息触发,这个消息就称作意图(Intent)。

Intent消息是android中一种同一或不同应用程序中的组件之间延迟运行时绑定的消息通知机制。intent本身(一个Intent对象)是一个被动的数据结构,保存一个将要执行的操作的抽象描述。具体地说:Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。

      对于这三种组件,都有独立的传送intent的机制:

(1)Activity:一个intent对象传递给Context.startActivity()或Activity.startActivityForRestult()去启动一个活动或使一个已存在的活动去做新的事情。

(2)Service:一个intent对象传递给Context.startService()去初始化一个service或传递一个新的指令给正在运行的service。类似的,一个intent可以传递给Context.bindService()去建立调用组件和目标服务之间的连接。

(3)BroadcastReceiver:一个intent对象传递给任何广播方法(如Context.sendBroadcast(),Context.sendOrderedBroadcast(),Context.sendStickyBroadcast()),都将传递到所有感兴趣的广播接收者。

在每种情况下,Android系统查找合适的activity、service、broadcastreceivers来响应意图,如果有必要的话,先初始化他们。这些消息系统之间没有重叠,即广播意图仅会传递给广播接收者,而不会传递活动或服务,反之亦然。

Intent可以分为两组:

(1)显式intent:通过名字指定目标组件。因为开发者通常不知道其它应用程序的组件名字,显式intent通常用于应用程序内部消息,如一个活动启动从属的服务或启动一个姐妹活动。

(2)隐式intent:并不指定目标的名字(组件名字字段是空的)。隐式intent经常用于激活其它应用程序中的组件。显示intent传递:Android显式传递一个intent到一个指定目标类的实例。Intent对象中只用组件名字内容去决定哪个组件应该获得这个intent,而不用其他内容。

隐式intent传递:需要另外一种不同的策略。由于缺省指定目标,Android系统必须查找一个最适合的组件(一些组件)去处理intent——一个活动或服务去执行请求动作,或一组广播接收者去响应广播声明。这是通过比较Intent对象的内容和intent过滤器(intentfilters)来完成的。

Intent对象

  一个Intent对象是一个捆信息,包含对intent有兴趣的组件的信息(如要执行的动作和要作用的数据)、Android系统有兴趣的信息(如处理intent组件的分类信息和如何启动目标活动的指令)。

intent的组件的名字:

         这个字段是一个ComponentName对象——是目标组件的完全限定类名(如"com.example.project.app.FreneticActivity")和应用程序所在的包在清单文件中的名字(如"com.example.project")的组合。组件名字是可选的,如果设置了组件名字,intent对象传递到指定类的实例;如果没有设置,Android使用intent中的其它隐式信息来定位合适的目标组件(见下面的Intent解析)。组件的名字通过setComponent(),setClass()或setClassName()设置,通过getComponent()读取。

Intent动作:

一个字符串命名的动作将被执行,或在广播intent中,已发生动作且正被报。动作很大程度上决定了剩下的intent如何构建,特别是数据(data)和附加(extras)字段,就像一个方法名决定了参数和返回值。正是这个原因,应该尽可能明确指定动作,并紧密关联到其它intent字段。换句话说,你应该定义你的组件能够处理的Intent对象的整个协议,而不仅仅是单独地定义一个动作。

一个intent对象的动作通过setAction()方法设置,通过getAction()方法读取。

Intent数据:

数据(data)是将作用于其上的数据的URI和数据的MIME类型。不同的动作有不同的数据规格。例如,如果动作字段是ACTION_EDIT,数据字段包含将显示用于编辑的文档的URI;如果动作是ACTION_CALL,数据字段将是一个tel:URI和将拨打的号码;

当匹配一个intent到一个能够处理该数据的组件,通常知道数据的类型(它的MIME类型)和它的URI很重要。类型也能够显示地设置,setData()方法指定数据的URI,setType()指定MIME类型,setDataAndType()指定数据的URI和MIME类型。通过getData()读取URI,getType()读取类型。

附加信息:

额外的键值对信息应该传递到组件处理intent。就像动作关联的特定种类的数据URIs,也关联到某些特定的附加信息。例如,一个ACTION_TIMEZONE_CHANGEintent有一个"time-zone"的附加信息,标识新的时区,ACTION_HEADSET_PLUG有一个"state"附加信息,标识头部现在是否塞满或未塞满;有一个"name"附加信息,标识头部的类型。附加信息可以作为一个Bundle使用putExtras()和getExtras()安装和读取。

标志:

Intent对象中有各种各样的标志,许多指示Android系统如何去启动一个活动(例如,活动应该属于那个任务)和启动之后如何对待它(例如,它是否属于最近的活动列表)。所有这些标志都定义在Intent类中。