【问题标题】:Android Bound Service vs Started Service for music appAndroid Bound Service vs Started Service for music app
【发布时间】:2016-02-07 04:21:37
【问题描述】:

我正在尝试深入研究服务架构。
仅出于测试目的,我正在创建音乐应用程序。
毫无疑问,音乐应该在服务中播放,但使用什么样的沟通方式? 据我所知,服务可以绑定或启动(或两者同时)

首先,我需要播放/停止/暂停/设置源...
其次,如果音乐播放器打开了事件,我需要通知 UI比如进度、缓冲……

这是我对此的看法。
我考虑混合绑定和启动服务。

就歌曲只能从 UI 设置以及暂停/播放/停止/搜索而言,我选择使用活页夹从 UI 与服务通信。 (在活动中绑定服务并让绑定器返回与服务通信)

来自服务的通知,如曲目完成、下一曲目、当前曲目位置。我决定使用Broadcast receiver 发送此类通知,因为它可以是多个感兴趣的组件。

所以我的问题是

  1. 音乐播放器服务的最佳通信方式(绑定或广播)是什么?
  2. 系统如何知道服务是什么?我的意思是,即使服务是bound,我也需要先调用startService 方法,然后再绑定它。这是否意味着即使调用了一个bindService 方法,它也被视为绑定服务,并且在调用unbind 方法时会被杀死?
  3. LocalBroadcastManager 与服务通信有意义吗?至于LocalBroadcastManager 对于每个应用程序都是本地的,为什么不使用绑定服务呢?如果其他应用对事件感兴趣,全球广播很有意义。

请帮助理解这个机制。

【问题讨论】:

  • 你完成音乐应用了吗?如果是,您是如何管理音乐的(播放、暂停、停止...)?通过服务、意向服务或其他方式?我在你的起点;)

标签: android android-intent android-service android-broadcastreceiver


【解决方案1】:
  1. 通信的最佳选择是根据您的要求同时使用 LocalBroadcasts 和 Binder 方法。如果您想从绑定的组件(如活动)中做一些服务,那么您应该使用活页夹。如果您需要将结果发送回应用程序,您应该使用 LocalBroadcast。

还有一个选项可用于使用消息传递。在这种情况下,活动和服务都使用相同的 ibinder,因此双向通信很容易。您可以将消息从活动发送到服务,并将服务发送到您的活动

  1. 在这一点上,您对启动绑定服务是错误的。在这种情况下,您不需要调用 startservice。只需要调用 bindservice 方法。

    bindService(new Intent(this, MessengerService.class), mConnection, 上下文.BIND_AUTO_CREATE);

您可以将多个组件绑定到此服务。当所有这些都未绑定时,服务将停止。

  1. 是的,LocalBroadcastmanagers 有意义。假设您想在您的应用程序中广播某些内容。您要更新 4-5 个组件。您将如何实现这一点。因此,使用本地广播是一个很好的功能。

例如,假设有两个服务从不同的活动开始,第二个服务在第一个服务完成工作后开始工作。因此,实现此目的的唯一方法是发送广播,第二个服务将注册此广播。因此它会收到它。

【讨论】:

  • 感谢您的回答!!我忘记了你在回答中提到的事情。该通信可以使用活页夹进行双向通信(例如使用强制转换到某个接口的片段和活动)。我认为如果已经使用了绑定服务,那么使用绑定器来实现它会更容易和更清洁,如果其他组件对事件感兴趣,那么使用 LocarBroadcast 会更好,对吗?
【解决方案2】:

是的。服务很难理解。

有些事情很容易。绑定服务总是bindService 方法启动。已启动的服务始终startService 方法启动。你确实不需要需要启动一个绑定的服务,或者绑定一个启动的服务。

接下来的很多内容都是粗略的概括......

开始服务

除非是IntentService,否则启动的服务几乎是无用的。 IntentServices 是运行异步任务的好工具。您向他们发送一小部分参数,他们就会开始执行这些参数指示的任何事情。它们就像void 方法一样,期望使用它们的副作用,而不是返回值。

绑定服务

绑定服务更难解释。虽然这个比喻在仔细检查时不成立,但绑定服务就像一个单一的工厂。例如,它是一种向应用程序中的所有活动提供具有单一状态的单一对象的方法。它的一个有趣特性是,只要绑定提供单例对象的服务,托管进程就不太可能被杀死。请注意,绑定服务提供的“单例”对象与提供它的服务几乎没有关系。取消绑定服务不会使其无效。

绑定服务也是在 Android 中进行进程间通信的主要方式。

你应该怎么做?

嗯,这是一个很笼统的问题。这是一个想法。将您的音乐播放器放入服务中很有意义。如果与它的通信主要是一种方式 - 对服务的命令 - 您有机会使用 IntentService 进行通信。除非有特定原因要做更复杂的事情,否则IntentService 的优势在于更简单。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多