Android 音乐应用的绑定服务与启动服务

Android Bound Service vs Started Service for music app

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

首先,我需要play/stop/pause/set来源...
其次,如果音乐播放器打开,我需要通知UI有关进度、缓冲等事件...

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

至于只能从 UI 和 paused/played/stopped/seek 设置歌曲,我选择使用活页夹与来自 UI 的服务通信。 (在 activity 内绑定服务并获取绑定器以与服务通信)

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

所以我的问题是

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

请帮助理解这个机制。

是的。服务很难理解。

有些事情很容易。绑定服务总是bindService 方法启动。启动的服务总是startService 方法启动。您不需要启动绑定服务,或绑定已启动的服务。

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

开始服务

启动的服务几乎没有用,除非它是 IntentService。 IntentServices 是 运行 异步任务的非常好的工具。您向他们发送一小束参数,他们就会开始执行这些参数指示的任何操作。它们类似于 void 方法,因为人们期望使用它们的副作用,而不是 return 值。

绑定服务

绑定服务更难解释。虽然这个比喻在仔细检查时会失效,但绑定服务有点像单例工厂。例如,它是一种向应用程序中的所有活动提供具有单一状态的单一对象的方法。其有趣的特性之一是,只要提供单例对象的服务被绑定,宿主进程就不太可能被终止。请注意,绑定服务提供的 "singleton" 对象与提供它的服务关系不大。取消绑定服务不会使其失效。

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

你该怎么办?

好吧,这是一个很笼统的问题。这是一个想法。将您的音乐播放器置于服务中很有意义。如果与它的通信主要是一种方式——向服务发出命令——那么您可以使用 IntentService 来完成。除非有特定的理由要做更复杂的事情,否则 IntentService 具有更简单的优点。

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

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

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

    bindService(new Intent(this, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE);

您可以将多个组件绑定到此服务。当所有的都解除绑定时,服务将停止。

  1. 是的,LocalBroadcastmanagers 很有意义。比方说你想在你的应用程序中广播一些东西。有 4-5 个组件需要 update.How 你会实现吗?因此使用本地广播是一个很好的特性。

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