一个service没有可视化的用户接口,而是运行在后台一个无限期限内。例如,当用户试图做其他事情时,一个service在后台播放音乐,或者它也可能在网络上提取数据,或做些计算并提供结果给需要它的activity。每一个service继承自Service基类。
一个最好的例证是一个媒体播放器从一个播放列表中播放歌曲。播放器应用程序可能有一到多个activity以允许用户来选择歌曲并开始播放。然而,音乐播放本身不能被一个activity处理,因为用户会期望音乐持续播放,甚至是在他们离开播放器并开始做其他事情时。要保持音乐继续播放,媒体播放器activity可以开始一个service来在后台运行。然后系统将保持音乐播放服务持续运行,甚至在启动播放器的activity离开屏幕以后也会持续播放。
连接(绑定)到一个正在进行的service(如果service还没有运行,就启动它)也是可能的。当连接后,你可以通过service暴露的接口与service进行通信。对于音乐service,这个接口可能允许用户暂停、后退、停止以及恢复播放。
像activity和其它组件一样,service运行在应用程序进程的主线程中。因此它们不会阻塞其它组件或用户接口,他们经常为耗时的任务(如音乐播放)产生另外的线程。
Broadcast receivers
一个broadcast receiver是一个什么也不做的组件,除了它接受广播公告并对其做出反应。许多广播源(broadcast orginate)在系统代码中----例如,声明时区的改变,电量过低,一个图像已经被拍照,或者用户改变了一个语言参数。应用程序还可以启动一个广播----例如,让其他应用程序知道一些数据已经被下载到设备上并且可以使用它们了。
一个应用程序可以有许多广播接收器(broadcast receivers)来对任何它认为重要的公告做出响应。所有的接收器扩展自BroadcastReceiver基类。
广播接收器并不显示一个用户接口。然而,在对它们接收到的信息做出响应时,它们可以启动一个activity,或者它们可以使用通知管理器(NotificationManager)来提醒用户。通知可以通过多种方式来获得用户的注意----闪烁背景照明灯,振动设备,播放声音等等。它们典型地会放置一个固定的图标在状态栏,用户可以打开这个图标来查看信息。
Content providers
一个Content provider使得一系列特定的应用程序数据对其他应用程序可用。这些数据可以存放在文件系统中,在一个SQLite数据库中,或者在任何其它可以被感知的形式中。内容提供器(content provider)扩展自ContentProvider基类,实现了一系列标准的方法,这些方法能够使其他应用程序来重新获取并存储它所控制的类型的数据。然而,应用程序并不直接调用这些方法。相反,它们使用一个ContentResolver对象并调用其方法。一个ContentResolver可以与任何内容提供器通话,它与提供者合作来管理任何相关的通信工序。(Content provider在稍后一节会专门讲述)
无论何时,只要有一个被特定的一个组件所处理的请求,Android就确保组件的应用程序处理正在运行,如果有必要就启动它,并且保证组件的一个合适的实例是可用的,如果有必要就创建这个实例。
2.1.2 激活组件:intents当一个请求来自一个ContentResolver时,内容提供器被激活。其他三个组件----activities,services和broadcast receivers----被名为intents的异步消息所激活。一个intent是一个Intent对象,持有消息的内容。对于activities和services来说,它意味着位于其他事物中被请求的动作和指定要操作的数据的URI。例如,它可能会为一个activity传送一个请求以代表给用户的一个图片,或者让用户编辑一些文本。对于broadcast receivers,Intent对象意味着被公告/通知的动作。例如,它可能会通告有兴趣的相关方,相机的按钮被按下了。
有各自的方法来用于激活每一类组件:
q 通过传递一个Intent对象到Context.startActivity()或Activity.startActivityForResult(),来启动一个activity(或者让做一些新的东西)。进行响应的activity可以通过调用其getIntent()方法来查看引起它被启动的原始内容(intent)。Android调用该activity的onNewIntent()方法来向其传递任何后续的intent。
一个activity经常启动下一个activity。如果它期望从它所启动的activity获得一个返回的结果,那么它就要调用startActivityForResult()而不是startActivity()。例如,如果它启动一个让用户挑选照片的activity,那么它可能期望返回被选中的照片。结果在一个Intent对象中被返回,而该Intent对象被传递给进行调用的activity的onActivityResult()方法中。