Intent对象-Intent Objects
Intent本 身是一个消息的集合。他包含那些传递给接收Intent的组件的信息(such as the action to be taken and the data to act on)和传递给Android系统的信息(例如应该绑定到Intent上的组件的类别和如何启动目标activity的指南)主要的,他包含了以下几点:
组件名-Component name
组件的名字是应该可以处理Intent,为其指明目标的。这一段所描述的就是关于ComponentName的--他是目标组件的类名的联合体(例如"com.example.project"
)。组件名字中所包含的包名的部分不需要必须与manifest文件中的包名相匹配。
组件的名字是非强制性的。如果他是固定的,那么Intent就会被传递给指定名字的类的实例,如果他不是固定的,那么Android就会通过 Intent中的其他信息找到合适的目标--可以查看本文档以后的提到的#Intent解决方法-Intent Resolution|Intent解决方法-Intent Resolution。
组件名字可以通过setComponent(), setClass()或setClassName()来设置,通过getComponent()来读取。
动作-Action
一个字符串命名了将要被执行的动作,或在广播intents事件中,已经发生并被报告的动作。Intent类定义了许多动作常量,包括如下:
你可以访问Intent|Intent类的定义查看一系列的代表一般行为动作的常量。其余行为动作的定义可以在Android API文档中的其他地方找到。你也可以在应用中自定义这样的常量串,这些常量要以包名作为前缀,例如"com.example.project.SHOW_COLOR
".
action的名字能够很好的说明intent有着怎样的机构--特别是#数据-Data|数据-Data和#Extras|Extras--就像 方法的名字决定了参数和返回值。所以,使用一个明确的action的名字是一个很好的主意。另外,要为你的Intent定义一个完整的协议,而不是孤立的 定义action。
我们用setAction()来设置Intent中的action并用getAction()来读取。
数据-Data
数据运行的URI和其MIME类型。不同的action被配与不同的data说明。例如,如果是ACTION_CALL
,那么他的data就是号码的URI--ACTION_VIEW
并且data是http:
URI,那么接收Intent的activity将下载并显示URI所指向的内容。
当为某个组件匹配一个可以处理数据的Intent的时候,通常除了要了解Data的URI以外,重要的是要知道Data的类型(MIME type)。例如,一个可以展示图片的组件不应该被调用来播放音频。
在很多情况下,Data的类型可以从URI中推测出来,特别是URI所展示的内容:指出了Data被用在什么位置及被哪种content provider控制(参考separate discussion on content providers)。但是Data的类型也可以在Intent中明确的设定。setData()方法设置Data的URI,setType()设置Data的类型(MIME type),setDataAndType()两者一起设置,getData()读取URI,getType()读取类型
分类-Category
Category是这样一个String:他包含了需要处理Intent的组件的种类的信息。很多Category的描述能够放在Intent里。就像Action那样,Intent也定义了一些Category常量,如下图表
参考Intent可以查看全部Category的列表
addCategory()方法可以把一个Category放入到Intent中,removeCategory()可以删除之前加入的Category,getCategories()可以得到目前在Intent中所有的Category
Extras
Extras是传递给目标组件的键值对信息。就像一些action匹配着特别的data uri,一些action匹配着特别的Extras。例如"time-zone"
指示新时区的信息,"state"
标识耳机设备是否插好的信息,除此还有SHOW_COLOR
的action,颜色值将被设置在一个键-值对信息中。
Intent有一系列的get..()
方法来取出数值。这些方法相对应的存在于Bundle类中。事实上,Extras也可以使用putExtras()和getExtras()来操作数据。
标志位-Flags
::Flags有着很多种类。很多用来通知Android System如何运行一个activity(例如某个activity应该属于哪个任务)和运行以后如何处理(例如,flag是否属于当前活动activity)。所有这些flag都是在Intent中定义的。
Android system 和平台本身的应用会使用Intent发送系统本身的广播并且激活系统定义的组件。如何构造一个Intent并且激活一个系统组件,请参考list of intents。