【Android 补补高】为什么我们要用 Service ?

技术更新换代快,成本温馨提示,请注意文章的更新时间。
本文最后更新于:2022年5月20日

Android 四大组件之一:Service ,为什么我们要用 Service ?Service 运行在什么线程?使用 Service 和使用 Handler/Thread 的区别?

什么是 Service ?

Service (服务)是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。

Service 分为前台服务、后台服务和绑定服务三种,三者面向的需求有所不同:

  • 前台服务:前台服务主要执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互,前台服务仍会继续运行。
  • 后台服务:后台服务执行用户不会直接注意到的操作。例如,如果应用使用某个服务来压缩其存储空间,则此服务通常是后台服务。在 API 26 以及更高的版本中,假如应用当前不在前台,系统会对后台服务加以限制,官方推荐改用计划作业
  • 绑定服务:当应用组件通过调用 bindService() 绑定到服务时,服务即处于绑定状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。

Service 的运行线程 ?

虽然 Service 给人的感觉是负责后台的事情,但是实际上 Service 还是运行在主线程上,所以假如你在 Service 中直接进行任何耗时的操作都是会导致主线程阻塞的。相关的耗时操作还是需要在子线程中进行。这也就引出了下一个问题:为什么我们要用 Service ?

为什么要用 Service ?

面试官常问的:为什么我们要用 Service ?我直接在 Activity 里面创建线程来用不好吗?

这个问题在官方文档中也有提到,如何在服务和线程之间进行选择,答案就是根据需求来选择。举个例子,以播放音乐为例,假如你只是想在当前场景下播放一段音乐,在切换到别的场景就不播放了,那大可使用线程来实现,场景结束了就结束线程,随用随开。但假如音乐播放是要贯穿整个 APP ,并且希望在任何地方都能快速控制我的音乐,比如音乐播放器,那就应该使用服务,毕竟不可能把负责音乐播放的线程在各个 Activity 之间传来传去。同理,对于那些耗时但又可能要跨 Activity 的操作,例如保存文件,下载文件,也应该使用服务,这样能保证在 Activity 切换的时候任务能继续执行,而不会因为 Activity 的状态变更而导致任务执行失败。