0

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

首先,我需要播放/停止/暂停/套源...
其次,我需要通知用户界面如果音乐播放器是关于像进展,缓冲等事件打开...

在这里,我对此的想法。
我想到混合绑定和启动服务。

只要歌曲只能从UI设置以及暂停/播放/停止/寻找,我选择使用活页夹与UI服务通信。 (绑定服务内部活动,并获得绑定回与服务通信)

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

所以我的问题是

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

请帮忙理解这个机制。

谢谢。

+0

您是否完成音乐应用程序?如果是,您如何管理音乐(播放,暂停,停止...)?通过服务,意向服务或其他?我在你的起点;) –

回答

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

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

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

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

您可以将多个组件绑定到此服务。当它们全部解除绑定时,服务将被停止。

  1. 是LocalBroadcastmanagers是有道理的。让我们说你想在你的应用程序中播出一些东西。有4-5个组件需要更新。你将如何实现这个目标。因此,使用本地广播是一个很好的功能。

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

+0

谢谢你的回答!我已经忘记了你在答案中提到的东西。该通信可以使用绑定程序进行双向解析(如使用投射到某个接口的片段和活动)。我认为,如果绑定服务已经被使用,那么使用绑定器来实现这个会更容易和更简洁,只有一件事情,如果其他组件对事件感兴趣,最好使用LocarBroadcast,对吗? – CROSP

+1

是的,你是对的 –

1

是的。服务很难理解。

有些东西很容易。绑定的服务是总是bindService方法开始。已启动的服务是总是startService方法开始。你做不是需要启动绑定服务,或绑定启动的服务。

许多接踵而来的是总的概括...

启动的服务

一开始服务几乎是无用的,除非它是一个IntentService。 IntentServices是用于运行异步任务的非常好的工具。您向他们发送一小组参数,然后他们关闭并执行任何参数指示。它们就像void方法一样,期望使用它们的副作用,而不是返回值。

绑定的服务

甲绑定的服务是难以解释。虽然这个隐喻在仔细检查后发生了故障,但这是一种像单件工厂这样的绑定服务。例如,它是一种为单个对象提供单一状态的方法,用于应用程序中的所有活动。其有趣的特性之一是,只要提供单例对象的服务受到约束,托管过程就不太可能被终止。请注意,绑定服务提供的“单例”对象与提供它的服务无关。解除绑定服务而不是使其无效。

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

你应该怎么做?

那么,这是一个非常普遍的问题。这是一个想法。将音乐播放器放入服务中很有意义。如果与它的沟通主要是一种方式 - 对服务的命令 - 那么您可以使用IntentService进行沟通。直到有一个特定的理由去做更复杂的事情时,IntentService的优点是更简单。

+0

谢谢你的完整答案。有什么好的文章或书籍可以阅读关于您可以建议的服务内部的内容? – CROSP

+1

不是你想要的答案,我怀疑,但我正在写一个现在:http://www.amazon.com/Android-Concurrency-G-Blake-Meike/dp/0134177436/ref=sr_1_1?s=books&ie = UTF8&qid = 1454861720&sr = 1-1&keywords = android + concurrency应该在今年第二季度推出。 –