绑定服务 vs 未绑定 + 单例通信

Bound Service vs Unbound + singleton for communication

我有一项服务,我需要与其通信(一项服务 - 多项 fragments/activities)。有两种选择:

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

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

使用绑定服务而不是服务将自己注册为委托(并通过 onDestroy 注销)有什么好处吗?

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

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

是的,在与 Activities/Fragments 等视图通信时,在 Android 中使用绑定服务是一个更好的选择。这是因为以下原因,

  1. 同步运行。
  2. 您可以更好地控制服务数据何时显示在视图的 UI 线程上。您可以选择何时以async/sync方式调用它。
  3. LocalBroadcastManager 仅异步运行。

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

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

一种方法与另一种方法相比的唯一好处是实施简单。

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

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

因为您需要您的服务 运行 正确的选择是使用启动的服务并在需要时让每个 activity 绑定到它。这是一个常见的模式。

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

但同时您可以使用绑定从 activity 与服务通信。

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