0

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

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

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

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

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

所以我的问题是

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

请帮助理解这种机制。

4

2 回答 2

1

是的。服务很难理解。

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

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

开始服务

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

绑定服务

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

在 Android 中,绑定服务也是进行进程间通信的主要手段。

你该怎么办?

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

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

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

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

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

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

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

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

于 2016-02-07T05:09:55.493 回答