如何在音乐播放服务和UI线程之间进行通信

时间:2012-05-03 16:04:11

标签: android android-service

我在ListView中有一个音乐标题列表。

我可以点击每个项目,通过服务中的MediaPlayer播放音乐。

现在我要实现2个功能:

  • 音乐进度栏,显示歌曲中的当前位置
  • 当歌曲结束时,服务将继续播放列表中的下一首歌

那么如何从后台服务更新UI? (我知道Stackoverflow上有一些解决方案但是我觉得从服务中每秒发送一个广播有点过分了,例如) 我必须使用Binding吗?绑定有什么好处? 现在我只是用Intent(startService(intent))启动服务,其中包含Song路径。

第二个问题怎么样?我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

我猜你自己建立了这项服务。因此,您知道它是如何构建的以及如何访问mediaPlayer引用。您需要做的是将您的服务转换为bound service.或许您希望通过startService启动您的服务(否则绑定的服务将无法在您的活动中生存),但之后,您将必须从你的活动中绑定它。

绑定后,您将获得IBinder(您将定义),并且能够通过此IBinder将mediaPlayer引用导出到绑定活动。之后,一切都非常简单,在媒体播放器上插入一个监听器并更新你的UI(在UI线程中!)。

此外,您还需要service to be put forward

答案 1 :(得分:0)

我正在解决非常类似的问题,但是,我自己做了混音/演奏部分。 android播放器服务部分的代码位于-github-

对于应用程序和服务之间的通信(它应该是一个前台服务,状态栏中有通知,否则可以非常频繁地静默杀死/暂停)我尝试了不同的方法并最终得到了

  • 活动 - >服务 - 使用Messenger
  • 服务 - >活动/任何事情 - 使用BroadcastReceiver

github上的代码不是太大(总共少于500行,包括导入)给你灵感......

顺便说一下。它还显示了一个服务绑定,它不会在活动退出时终止服务。