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

3
我有一个音乐标题列表,显示在ListView中。我可以通过在Service中的MediaPlayer点击每个项目来播放音乐。现在我想要实现两个功能:
1. 音乐ProgressBar,显示歌曲当前位置。 2. 当一首歌曲播放完毕时,服务应继续播放下一首歌曲。
那么,我该如何从后台服务更新UI?(我知道stackoverflow上有一些解决方案,但它们对我来说似乎有点过度kill,例如每秒钟从服务发送一次广播)。我必须使用Binding吗?Binding的好处是什么?目前,我只是使用包含歌曲路径的Intent(startService(intent))启动服务。
至于第二个问题,我该怎么做呢?
2个回答

2
我猜您是由自己构建服务的。因此,您知道它是如何构建以及如何访问 mediaPlayer 引用。您需要做的是将您的服务转换为绑定服务。也许您希望通过 startService 启动您的服务(否则绑定服务将无法幸存您的活动),但之后,您将不得不从活动内部绑定它。
一旦绑定,您将获得一个IBinder(您将定义该 IBinder),并可以通过此 IBinder 将 mediaPlayer 引用导出到已绑定的活动中。之后,一切都很简单,将一个监听器插入媒体播放器并在 UI 线程中更新您的UI。
此外,您需要使您的服务处于前台

但是我读到了有关绑定的内容,说一旦我离开应用程序,服务就会被销毁。但是我希望音乐仍然在播放,除非我在应用程序中点击停止。 - Sebastian Oberste-Vorth
1
不,只有当您通过绑定服务启动服务时,服务才会在活动退出时被销毁。如果您通过startService启动服务,则它将具有独立于绑定到它的活动的生命周期。阅读文档中的所有内容。 - Snicolas
不要循环播放,注册媒体播放器的监听器。哦,不,绝不要循环播放!很抱歉,我没有这样精确的教程。只需按照我给你的轨迹走,这是一个很好的起点,真的。 - Snicolas
1
从活动中,通过绑定程序向您的服务进行绑定。绑定器将拥有一个名为getMediaPlayer的方法。然后,您的活动将获得对播放器的引用,并将添加一个侦听器(我假设这将是活动的内部类,因为正如您所说,从活动内部更新UI更容易)。 - Snicolas
嗨,我正在制作一个音乐播放器。我已经设置了一个绑定服务(最初由startService启动)。在我的服务中,我有一个'onSeekCompleteListener'来告诉我何时播放下一首歌曲。我应该在我的活动中插入另一个侦听器(以更新UI)吗?据我所理解,这就是您在答案中所说的。 - Amit0191
显示剩余4条评论

0

我曾经解决过非常相似的问题,但是混合/播放部分是我自己完成的。 Android 播放器服务部分的代码位于-github-

为了在应用程序和服务之间进行通信(它应该是具有状态栏通知的前台服务,否则它可能会被频繁地静默杀死/暂停),我尝试了不同的方法,并最终选择了

  • Activity -> Service - 使用 Messenger
  • Service -> Activity / 任何东西 - 使用 BroadcastReceiver

Github 上的代码并不太大(总共不到 500 行,包括导入),可以给你一些启示...

顺便说一句,它还显示了一个不会在活动退出时销毁服务的服务绑定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接