Android 绑定服务与未绑定服务+;通信单例

Android 绑定服务与未绑定服务+;通信单例,android,android-service,android-service-binding,Android,Android Service,Android Service Binding,我有一个服务,我需要与之通信(一个服务-许多片段/活动)。有两种选择: 有一个控制服务的单例-启动它,然后绑定到它(使用应用程序上下文) 有一个控制服务的单例-启动它,服务在就绪时注册为单例的委托(在WeakReference中) 解决方案2对我来说似乎更简单,但每当我读到关于与服务通信的内容时,就会想到绑定服务的概念 使用绑定服务而不是将自身注册为委托(并在onDestroy中注销)有什么好处吗 编辑1:该服务旨在保持通信的活跃性,建立新的通信渠道成本很高。即使没有人请求任何数据,它也应该保持

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

  • 有一个控制服务的单例-启动它,然后绑定到它(使用应用程序上下文)
  • 有一个控制服务的单例-启动它,服务在就绪时注册为单例的委托(在
    WeakReference
    中)
  • 解决方案2对我来说似乎更简单,但每当我读到关于与服务通信的内容时,就会想到绑定服务的概念

    使用绑定服务而不是将自身注册为委托(并在
    onDestroy
    中注销)有什么好处吗

    编辑1:该服务旨在保持通信的活跃性,建立新的通信渠道成本很高。即使没有人请求任何数据,它也应该保持通道活动(心跳)

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

    是的,在与活动/片段等视图通信时,在Android中使用绑定服务是一个更好的选择。这是因为:

  • 它同步运行
  • 当服务数据显示在视图的UI线程上时,您可以对其进行更多的控制。您可以选择何时以异步/同步方式调用它
  • LocalBroadcastManager仅异步运行
    绑定和未绑定的服务都是可用的模式,您应该选择适合您的用例的模式

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

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

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

    • 如果所有活动解除绑定,服务将停止自身,并在第一个活动绑定到服务时启动自身
    • 您不需要跟踪singleton中的所有跑步活动并手动解除绑定
    • 您不需要维护单例管理器,代码更少->bug更少
    • 有时系统会跳过onDestroy,您可能会使用2方法泄漏服务

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

    已启动的服务将一直运行,直到您显式停止它或它自身停止为止,您可以有一个单独的管理器来负责这一点

    但同时,您可以使用绑定从活动与服务通信


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

    不知道
    onDestory()
    可能会被跳过。我对我的原始问题添加了一些编辑。我知道,如果直接从活动或片段绑定,服务将不知道在哪里注册自己。但是,如果你想有一个抽象层,并且你想从一个单例绑定,这其实并不重要,因为绑定器返回了一个对服务的引用。你不需要在单例中绑定,你只需要调用
    context.startForegroundService()