Android绑定服务vs已启动音乐应用服务

时间:2016-02-07 04:21:37

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

我正在努力深入了解服务架构 仅仅是为了测试目的我正在创建音乐应用程序 毫无疑问,音乐应该在服务中播放,但使用什么样的通信? 据我所知,服务可以绑定或启动(或同时启动)

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

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

只能从UI设置歌曲以及暂停/播放/停止/搜索我选择使用活页夹从UI进行与服务的通信。 (绑定服务内部活动并获取绑定回来与服务进行通信)

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

所以我的问题是

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

2 个答案:

答案 0 :(得分:1)

呀。服务很难理解。

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

以下是很多概括......

已启动服务

启动服务几乎无用,除非它是IntentService。 IntentServices是运行异步任务的非常好的工具。你向他们发送了一小捆参数,然后他们就去做那些参数所指示的事情。它们就像void方法一样,期望使用它们的副作用,而不是返回值。

绑定服务

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

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

你应该怎么做?

嗯,这是一个相当普遍的问题。这是一个想法。将音乐播放器置于服务中非常有意义。如果与它的通信主要是一种方式 - 对服务的命令 - 你有可能用IntentService来做。除非有特定理由做更复杂的事情,IntentService的优点是更简单。

答案 1 :(得分:1)

  1. 最佳通信选择是根据您的要求使用LocalBroadcasts和Binder方法。如果您想从绑定组件(如活动)中执行某些服务,则应使用绑定器。如果需要将结果发送回应用程序,则应使用LocalBroadcast。
  2. 还有一个选项可用于使用消息传递。在这种情况下,活动和服务都使用相同的ibinder,因此双向通信很容易。您可以将活动中的消息发送到服务和服务

    1. 在这一点上,你错误地开始绑定服务。在这种情况下,您无需调用startservice。只需调用bindservice方法即可。

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

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

      1. 是LocalBroadcastmanagers有道理。让我们说你想在你的应用程序中播放一些东西。您想要更新4-5个组件。您将如何实现这一目标。因此,使用localbroadcasts是一个很好的功能。
      2. 例如,假设有两个服务从不同的活动开始,第二个服务在第一个服务完成其工作时开始工作。因此,实现此目的的唯一方法是发送广播,第二个服务将注册此广播。因此它会收到它。