3

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

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

现在我想实现 2 个功能:

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

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

第二个问题呢?我怎样才能做到这一点?

4

2 回答 2

2

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

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

此外,您将需要提出您的服务

于 2012-05-03T16:15:32.943 回答
0

我正在解决非常相似的问题,但是,我自己做了混音/演奏部分。android player-service 部分的代码位于-github-

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

  • 活动 -> 服务 - 使用 Messenger
  • 服务 -> 活动 / 任何东西 - 使用 BroadcastReceiver

github 上的代码并不算大(包括导入在内总共不到 500 行)给你一个启发......

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

于 2012-05-03T16:37:04.537 回答