2012-05-03 68 views
3

我有一個ListView中的音樂標題列表。如何在音樂播放服務和UI線程之間進行通信

我可以點擊每個項目以通過服務中的MediaPlayer播放音樂。

現在我想要實現2個特點:

  • 音樂進度被顯示在樂曲的當前位置
  • 服務將繼續播放時,歌曲結束,在列表中的下一首歌曲

那麼如何從後臺服務更新UI? (我知道在Stackoverflow上有一些解決方案,但他們似乎有點矯枉過正,每秒從服務中發送廣播) 我必須使用綁定嗎?綁定有什麼好處? 現在我剛剛開始包含歌曲路徑的Intent(startService(intent))的服務。

第二個問題呢?我怎樣才能做到這一點?

回答

2

我想你自己構建了服務。因此您知道它是如何構建的以及如何訪問mediaPlayer參考。您需要做的是將您的服務轉變爲bound service.也許您會希望通過startService開始您的服務(否則綁定的服務將無法在您的活動中繼續存在),但之後,您必須從您的服務內部綁定活動。

綁定後,您將得到IBinder(您將定義),並且將能夠通過此IBinder將mediaPlayer引用導出到綁定活動。之後,一切都非常簡單,在媒體播放器上插入監聽器並更新UI(在UI線程中!)。您也需要您的service to be put forward

+0

但我讀了關於綁定,一旦我離開應用程序,服務將被銷燬。但我確實希望音樂仍在播放,除非我在應用程序中單擊停止。 –

+1

否,當活動僅在通過綁定服務啓動服務時退出時纔會銷燬綁定的服務。如果您通過startService啓動服務,那麼它的生命週期將獨立於與其綁定的活動。閱讀文檔及其中的所有內容。 – Snicolas

+0

http://developer.android.com/guide/topics/fundamentals/services.html。前兩段 – Snicolas

0

我正在解決非常類似的問題,但是,我自己做了混音/播放部分。 安卓播放器服務部分的代碼是-github-

對於應用程序和服務之間的通信(它應該是一個前臺服務,狀態欄中有通知,否則它可以被悄悄地殺死/暫停)嘗試用不同的方法,並結束了與

  • 活動 - >服務 - 使用Messenger的
  • 服務 - >活動/任何東西 - 用廣播接收器

github上的代碼不是太大(包括進口在內的總計少於500行)給你一個靈感...

Btw。它還顯示一個服務綁定,它不會在活動退出時終止服務。