android - 绑定(bind)服务 vs 未绑定(bind) + 单例通信

标签 android android-service android-service-binding

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

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

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

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

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

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

最佳答案

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

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

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

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

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

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

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

但与此同时,您可以使用绑定(bind)从您的 Activity 中与服务进行通信。

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

关于android - 绑定(bind)服务 vs 未绑定(bind) + 单例通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51355649/

相关文章:

Android 从 TextView 中的 HTML Linkify

android - 从服务android获取窗口显示

android - 将本地服务绑定(bind)到 Activity 或使用广播接收器,哪个更有效?

android - 如何防止用户强制停止android服务?

Android 与跨多个应用的​​现有服务绑定(bind)

android - 如何在被杀死时自动重启服务?

java - 导航栏按钮在从服务绘制的布局上没有响应

java - 如何在非 TabActivity 的 Activity 中创建 tabHost

android - 如何锁定我公司的 Android 服务?

java - 为什么我收到这样的消息 :java. lang.NoSuchMethodError: No virtual method fetchProvidersForEmail(Ljava/lang/String;)