在本教程中,我们将探索Service
组件及其超类IntentService
。 您将学习何时以及如何使用此组件为长时间运行的后台操作创建出色的并发解决方案。 我们还将快速浏览IPC (进程间通信),以学习如何与运行在不同进程上的服务进行通信。
1.服务组件
Service
组件是Android并发框架中非常重要的一部分。 它满足了在应用程序中执行长时间运行的需求,或者为其他应用程序提供了某些功能。 在本教程中,我们将只专注于Service
的长期运行任务功能,以及如何使用此功能来提高并发性。
什么是服务?
Service
是一个简单的组件,由系统实例化以执行一些长期运行的工作,这些工作不一定依赖于用户交互。 它可以独立于活动生命周期,也可以在完全不同的过程中运行。
在深入讨论Service
代表什么之前,必须强调一点,即使服务通常用于长时间运行的后台操作并在不同的进程上执行任务, Service
也不代表Thread
或进程 。 如果明确要求,它将仅在后台线程或其他进程中运行。
Service
具有两个主要功能:
- 应用程序的一种功能,可以在后台将系统要执行的操作告知系统。
- 应用程序将其某些功能公开给其他应用程序的工具。
服务和线程
关于服务和线程有很多困惑。 声明Service
,它不包含Thread
。 实际上,默认情况下,它直接在主线程上运行,并且对它所做的任何工作都可能冻结应用程序。 (除非它是IntentService
,它是已经配置了工作线程的Service
子类。)
那么,服务如何提供并发解决方案? 嗯, Service
默认情况下不包含线程,但是可以轻松地将其配置为与自己的线程或线程池一起使用。 我们将在下面看到更多信息。
无论缺少内置线程,对于某些情况下的并发问题, Service
都是一个很好的解决方案。 选择Service
不是其他并发解决方案(例如AsyncTask
或HaMeR框架)的主要原因是:
-
Service
可以独立于活动生命周期。 -
Service
适合于长时间运行。 - 服务不依赖于用户交互。
- 当在不同的进程上运行时,即使系统资源短缺,Android也可以尝试保持服务活动。
- 可以重新启动
Service
以恢复其工作。
服务类型
有两种Service
类型,即启动和绑定。
已启动的服务通过Context.startService()
启动。 通常,它仅执行一项操作,并且会无限期运行,直到操作结束,然后它会自行关闭。 通常,它不会向用户界面返回任何结果。
绑定服务是通过Context.bindService()
启动的,它允许客户端和Service
之间进行双向通信。 它还可以与多个客户端连接。 当没有任何客户端连接时,它会自我毁灭。
要在这两种类型之间进行选择, Service
必须实现一些回调: onStartCommand()
作为启动服务运行,