绑定服务与无限制+单例进行通信

时间:2018-07-16 06:19:38

标签: android android-service android-service-binding

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

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

对我来说,解决方案2似乎更简单,但是每当我阅读有关与服务进行通信的内容时,便会有绑定服务的概念。

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

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

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

2 个答案:

答案 0 :(得分:2)

绑定服务和非绑定服务都是可用的模式,您应该选择适合您使用情况的任何模式。

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

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

对于您而言,我认为您仅在运行活动和片段时才需要该服务,然后,我认为最简单的方法是制作绑定的服务并使每个活动都绑定到该服务。这样,您将在活动(和片段,因为它们可以访问包含的活动)与服务之间获得一个简单的通信接口。 这种方法的好处是:

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

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

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

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

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

答案 1 :(得分:0)

是的,当与活动/片段之类的视图通信时,在Android中使用绑定服务是更好的选择。这是由于以下原因,

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