Android应用程序组件(二)

来源:互联网 发布:淘宝智能旺铺又什么用 编辑:程序博客网 时间:2024/05/22 00:14

意图的创建

意图对象包含Android系统用来决定启动哪个组件的信息(例如应该接收这个意图的精确的组件名或组件类),加上为让接收意图的组件执行适当的动作需要的信息(例如执行的动作和处理的数据)。

包含在意图中的基本信息包括:

组件名称

要开始的组件的名称。

这是可选的。它是显式意图需要的重要信息,意思是这个意图应该只被传递给由组件名称指定的应用程序组件。隐式意图不使用组件名称,由系统根据意图中的其他信息(例如动作、数据和分类)决定由哪些组件接收该意图。

注意:当启动服务时,总得指定组件名称。否则就不能确保哪个服务来响应这个意图,用户也不能看到启动了哪些服务。

意图使用ComponentName对象作为存放组件名称的字段,可以使用目标组件的含包名的可识别的类名为该字段赋值,例如com.example.ExampleActivity。可以通过setComponent()setClass()setClassName()或使用意图的构造器设置组件名称。

动作

动作是指定需要执行的一般动作的字符串(例如查看或选择)。

意图应用于广播时,发生和要被报告的是动作。动作最大程度地决定了剩下的意图的结构-特别是在数据和附加项的内容。

可以在应用程序中为意图指定自己的动作(或者由其他应用程序根据该动作用来启动该应用程序的组件),但是你应该总使用意图类或其他应用框架类定义的动作常量。以下是用于启动活动的一些普遍使用的动作:

  • ACTION_VIEW。当活动有一些信息可以显示给用户时,在传递给startActivity()的意图中使用该动作。例如在图库应用中要显示一张图片或者在地图应用程序中查看一个地址。
  • ACTION_SEND。当有一些数据用户要和另一个应用程序共享时,可以在传递给startActivity()的意图中使用该动作,也被称为共享意图。例如电子邮件应用程序或社交共享应用程序。

意图类中提供了更多定义一般动作的常量。在Andrdoid框架的其他地方也定义了很多动作。

可以使用setAction()或意图构造器来指定该意图的动作。

如果定义了自己的动作,确保添加应用程序的包名作为其前缀。例如:

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";

数据

数据是指向被处理的数据的URI(统一资源定位符,一个Uri对象)或者数据的MIME(多用途互联网邮件扩展类型)类型。提供的数据的类型一般由意图的动作决定。例如,如果动作是ACTION_EDIT,那么数据应该包含要编辑的文档的URI

当创建意图时,除了指定数据的URI,指定数据的类型通常是很重要的(它的MIME类型)。例如,能够显示图片的活动可能并不能够播放一个音频文件,尽管它们的URI格式是相似的。因此,指定数据的MIME类型可以帮助Android系统找到接收意图的最合适的组件。然而,有时,从URI中可以推断出数据的MIME类型,特别当数据是content:URI时,这表示数据存储在设备上且由内容提供者控制,这就使得数据的MIME类型自动对系统可见。

使用setData()方法只设置数据的URI,使用setType()只设置数据的MIME类型。如果必要,可以显示地同时设置两者使用setDataAndType()

注意:如果想要同时设置URI和MIME类型,不要分别调用setData()setType()因为它们会让另一个值为空。

类别

包含哪类组件应该处理这个意图的额外的信息的字符串。在一个意图中可以有任何数量的类型描述,但是大多数意图并不需要类别。以下是几个普遍的类别:

  • CATEGORY_BROWSABLE。目标活动允许自己由一个网页浏览器启动来显示链接指向的数据,例如图片或电子邮件消息
  • CATEGORY_LAUNCHER。该活动是一个任务的起始活动,并被放置在系统的应用程序启动器里。

在意图类的描述中可以查看可用类别的完整列表。

可以通过addCategory()方法为意图指定一个类别。

以上的四类属性(组件名称、动作、数据和类别)代表了意图的定义特征。通过读取这些属性,Android系统能够解析出应该启动哪个组件。

然而,意图可以带有额外的信息,这些信息并不影响目标组件的解析。意图提供的额外信息包括:

附加

装载完成特定动作需要的额外信息的键值对。就像一些应用使用特殊类型的数据URI,一些动作也需要特殊的附加内容。

可以利用多个putExtra()方法添加额外的数据,每个接收两个参数:键和值。也可以创建一个包含所有附加数据的Bundle对象,然后利用putExtras()方法将该对象插入意图中。

例如,当创建一个要求ACTION_SEND动作来发送邮件的意图,可以使用EXTRA_EMALI键指定收件人的名称,并用EXTRA_SUBJECT键指定邮件的主题。

意图类为标准的数据类型准备了很多EXTRA_*常量。如果想要声明自己的附加键(为你的应用程序要接收的意图),确保在名称前包含应用程序的包名。例如:

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";

标志

定义在意图类中的标志是作为意图的元数据。标志可能指导Android系统如何启动活动(例如,这个活动应该归属的任务)并且在它启动后如何对待它(例如,是否把它放在最近活动列表)。

0 0