基础知识
服务(Service)在 Android 中实现程序的后台运行,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使当程序被切换到后台,或者打开了另外一个应用程序,服务仍然能够保持正常运行。不过,服务并不是运行在一个独立的进程中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行
另外,也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程当中的。也就是说,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况。
服务可以在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互
注:服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定),所以不能再其中进行耗时操作,如果需要耗时操作就要新开线程
服务基本上分为两种形式:
启动
应用组件调用 startService() 启动服务,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。已启动的服务通常是执行单一操作,而且不会将结果返回给调用方,即,不与启动它的组件交互。例如,它可能通过网络下载或上传文件。 操作完成后,服务会自行停止运行。
绑定
应用组件调用 bindService() 绑定到服务,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
对比
服务类型 销毁时机 是否与启动它的组件交互 启动 stopService或stopSelf才会销毁 否 绑定 当绑定它的所有组件销毁后,或都取消绑定unbindService,就会销毁 是
可以启动或绑定一个服务的组件
在清单文件中注册服务
<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>
使用服务还是线程
服务是一种即使用户未与应用交互(Activity不可见,应用处于后台),但它仍要在后台运行的组件,所以只有在必要时才使用服务。
在用户与应用交互时(Activity可见),若需要在主线程以外执行操作,就要用线程而不是服务。如果想在Activity运行的同时播放音乐,就应该创建线程播放。如果在音乐应用处于后台时仍要播放音乐,就要用服务。