服务没有可视化的用户界面,而是在一段时间内在后台运行的。比如,一个服务可以在用户做其他事情的时候在后台播放背景音乐、从网络上获取一些数据或者计算一些东西并提供给需要这个运算结果的Activity使用。每个服务都来自Service基类。
一个媒体播放器播放列表中的曲目是一个不错的例子。播放器应用程序可能有一个或多个Activity来给用户选择歌曲并进行播放。然而,音乐播放这个任务本身不应该被任何Activity所处理,因为用户期望在他们离开播放器应用程序而开始做别的事情时,音乐仍在继续播放。为达到这个目的,媒体播放器Activity应该启用一个运行于后台的服务。而系统将在这个Activity不再显示于屏幕之后,仍维持音乐播放服务的运行。
你可以连接至一个正在运行的服务。连接之后,你可以通过那个服务暴露出来的接口与服务进行通信。对于音乐服务来说,这个接口可以允许用户暂停、回退、停止以及重新开始播放。
如同Activity和其他组件一样,服务运行于应用程序进程的主线程内。所以,它不会对其他组件或用户界面有任何干扰,它们一般会派生一个新线程来进行一些耗时任务(比如音乐回放)。
开启Service有两种方式,具体如下。
1.Context.startService()
Service会经历onCreate ->onStart(如果Service还没有运行,则Android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart()方法可能会重复调用多次);StopService的时候直接调用onDestroy(),如果是调用者自己直接退出而没有调用StopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService()关闭Service。
【注意】
多次调用Context.startservice()不会发生嵌套(即使会有相应的onStart()方法被调用),所以无论同一个服务被启动了多少次,一旦调用Context.stopService()或者StopSelf(),它都会被停止。补充说明:传递给StartService(0的Intent对象会传递给onStart()方法。调用顺序为:onCreate -->onStart(可多次调用) -->onDestroy。
2.Context.bindService()
Service会经历onCreate() -->onBind(),onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -->onDestroyed相应退出,所谓绑定在一起,就是共存亡。