应用程序组件是Android应用程序的基本构建单元。每个组件是系统进入你的应用程序的不同入口点。不是所有的组件对于用户都是实际上的入口点,有些是互相依赖的,但是每个组件都有特定的作用——每个都是唯一的构建单元,这些构建单元定义你应用程序的全部行为
有四种不同类型的应用程序组件。每种都有不同的用处并且有不同的生命周期。生命周期定义了他们是怎样被创建和销毁的。
四类不同的应用程序组件分别有:
Activities
一个Activity代表一个单独的拥有用户界面的屏幕。比如,一个邮件应用程序可能拥有一个显示新邮件的列表的Activity,一个编写邮件的Activity,一个读邮件的Activity。虽然这些Activity一起工作,但是他们是相互独立的。因此一个不同的应用程序也可以启动这些Activity中的任何一个(如果邮件应用程序允许的话)。比如一个摄像头应用程序为了能让用户分享一张图片它能启动邮件应用程序中的编写邮件的Activity。
一个Activity是由Activity类的子类来实现的。
Services
一个Service组件是运行在后台的一个进程,这个进程处理一个长时间的操作或者是一个远程调用。一个Service不需要提供一个用户界面。比如,一个Service可以在用户运行一个不同程序的同时在后台播放音乐,或者在不阻塞一个Activity的用户界面的同时获取网络数据。其他的组件,比如一个Activity,可以启动一个Service并且与之交互。
一个Service是由Service的子类来实现的。
Content providers
一个Content provider管理一组共享的应用程序数据。你可以把这些数据存储到文件系统、一SQLite数据库、互联网或者任何你的应用程序可以访问的持久化存储设备中。通过Content provider其他的应用程序能够查询甚至修改(如果Content provider允许修改操作)这些数据。例如Android系统提供了管理联系人信息的Content provider。因此,任何一个应用程序在拥有相应权限的情况下都可以访问这个Content provider管理的数据(比如ContactsContract.Data)来读取或者修改某个联系人的信息。
Content provider用于管理应用程序不与其他程序共享的的私有数据也是非常有用的。不如Note Pad例子程序就使用了一个Content provider来存储数据。
一个Content Provider是由ContentProvider的子类来实现的,并且必须实现一组使其他应用程序能与之通信的API。更多信息请参照Content Providers开发者指南。
Broadcast receivers
一个Broadcast receiver组件用于响应整个系统的广播通知。大量的广播都是由系统产生的。例如屏幕关闭的广播,电量不足的广播,拍了一张相片的广播。应用程序也可以发出广播,例如让其他应用程序知道一些数据已从网上下载了,并且它们可以使用这些数据。虽然broadcast receiver不显示用户界面,但是当广播事件发生的时候他们可以创建一个状态栏通知来提示用户。更加普遍的情况是,一个Broadcast receiver只是一扇通向其他组件的“大门”,它只做非常少量的工作。例如它可以基于一个广播事件启动一个Service来完成一些工作。
一个Broadcast receiver是由BroadcastReceiver的子类来实现的,并且每个广播都是当作一个Intent对象来传递的。
Android系统的一个独一无二的设计就是一个应用程序可以启动其它应用程序的组件。例如如果你希望用户通过摄像头来拍摄一张照片,而其他应用程序已经实现了这个功能,那么你的应用程序可以直接使用它,而不是自己开发一个Activity来实现这一功能。你不需要通过合并或者事件链接到摄像头应用程序的代码,而是直接启动摄像头应用程序实现拍照功能的Activity。当拍照完成时,照片功过事件返回到你的应用程序中。对于用户来说,看起来拍照功能就是你的应用程序的一部分。
当系统启动一个组件的时候,它为应用程序开启一个进程(如果应用程序还没有运行),并且实例化这个组件需要的所有的类。例如,如果你的应用程序启动一个摄像头应用程序中实现拍照功能的Activity,这个Activity运行在属于摄像头应用程序的进程中,而不是你的应用程序的进程中。因此,和其它大多数操作系统不一样,Android应用程序不止一个单独的入口。(例如,没有main函数)
因为每个应用程序运行在独立的进程中,并且每个进程都有文件权限来限制其它程序的访问,你的应用程序不能直接启动其它应用程序的组件。尽管如此,Android系统可以启动它们。因此,你必须传递一个消息给Android系统,这个消息定义了你想启动某个组件的意图,Android系统接收到这个消息后为你启动其他应用程序的组件。
启动组件
四种组件中的三种——Activity、Service和Broadcast receiver——通过被称作Intent的异步消息启动。Intent在运行时把独立的组件互相绑定(你可以认为Intent是组件为了请求一个操作派出的信使),不管这个组件是属于你的应用程序还是他的应用程序。
一个Intent对象创建一个Intent,它定义了一个启动某个或者某种组件的消息。一个Intent的意图分别可以是明确的,也可以是含蓄的。
对于Activity和Service来说,一个Intent定义了一个行为(例如,“展示”或者“发送”一些东西)和指定相关的数据的URI(其中包括启动组件可能需要知道的数据)。例如,一个Intent可能传递一个Activity的请求来显示一张图片或者打开一个网页。在某些情况下,你能够启动一个Activity来接收Intent中的数据,这个Activity也返回一个数据包含在Intent中(例如,你发布了一个Intent让用户选取一个联系人信息,并且返回给你,返回的Intent中包含了指向选取的联系人信息的URI)。
对于Broadcast receiver来说,Intent只是简单地定义了被广播的公告(例如一个显示设备电池电量低的广播只包括一个指出“电量低”的操作字符串)。
其他类型的组件,Content provider,不是由Intent来启动,而是在ContentResolver向它发出一个请求时被启动。Content resolver处理所有与Content provider的直接相关的事务,因此组件不需要直接与Content provider通信,替而代之调用ContentResolver对象的方法。这样在Content provider和组件请求信息之间保留了一个抽象层(为了安全)。
启动每种组件都有不同的方法:
l 你可以通过传递一个Intent对象到startActivity()或者startActivityForResult()(当你希望这个Activity返回结果时)方法来启动一个Activity。
l 你可以通过传递一个Intent对象到startService()方法来启动一个Service(或者传递新的指令到正在运行的Service)。或者你可以通过传递一个Intent对象到bindService()来绑定到Service。
l 你可以通过传递一个Intent对象到sendBroadcast(),sendOrderedBroadcast()或者sendStickyBroadcast()方法来发布一个广播。
l 你可以通过调用ContentResolver对象上的query()方法来对一个Content provider执行查询操作。