首页 > 解决方案 > Bound Service vs Unbound + singleton 进行通信

问题描述

我有一项服务,我需要与之通信(一项服务 - 许多片段/活动)。有两种选择:

  1. 有一个控制服务的单例 - 启动它然后绑定到它(使用应用程序上下文)
  2. 有一个控制服务的单例 - 启动它,服务准备好后注册为单例的委托(在 a 中WeakReference

解决方案 2 对我来说似乎更简单,但每当我读到与服务通信时,就会出现绑定服务的概念。

拥有绑定服务而不是服务将自身注册为委托(并取消注册onDestroy)有什么好处?

编辑1:该服务是为了保持通信活跃,建立一个新的通信渠道是昂贵的。即使没有人请求任何数据,它也应该保持通道处于活动状态(心跳)。

该服务是前台的,即使请求数据的活动被系统杀死,它也应该运行。下次创建时,数据将在那里。一个屏幕请求的数据可能对其他屏幕有用(因此必须存储在单例中)。

标签: androidandroid-serviceandroid-service-binding

解决方案


绑定和非绑定服务都是可用的模式,您应该选择更适合您的用例的模式。

如果您希望您的服务与绑定到它的组件具有相同的生命周期,则应该选择绑定服务。如果您需要独立服务,请使用未绑定版本。

一种方法相对于另一种方法的唯一好处是实现的简单性。

在您的情况下,我认为您仅在有正在运行的活动和片段时才需要该服务,那么在我看来,最简单的方法是创建一个绑定服务并让每个活动都绑定到它。这样,您将在活动(和片段,因为它们可以访问包含活动)和您的服务之间获得一个简单的通信接口。这种方法的好处是:

  • 如果所有活动都解除绑定,服务将自行停止,并在第一个活动绑定到它时自行启动。
  • 您无需跟踪单例中的所有正在运行的活动并手动取消绑定
  • 你不需要维护一个单例管理器,更少的代码 -> 更少的错误
  • 有时系统可以跳过 onDestroy,您可以使用 2 方法泄漏服务。

由于您需要运行服务,因此正确的选项是使用已启动的服务并在需要时使每个活动绑定到它。这是一种常见的模式。

已启动的服务将一直运行,直到您明确停止它或它自行停止,您可以有一个单独的管理器来负责。

但与此同时,您可以使用绑定从您的活动中与服务进行通信。

所以基本上与第一种建议的方法相比,您需要一些实例来启动和停止服务,但是活动和服务之间的通信将是相同的 - 使用绑定。


推荐阅读