3

ListView に音楽タイトルのリストがあります。

各項目をクリックして、Service の MediaPlayer を介して音楽を再生できます。

今、私は2つの機能を実装したいと考えています:

  • 曲の現在位置を示す Music ProgressBar
  • リスト内の次の曲でソングが終了しても、サービスは引き続き再生されます。

では、バックグラウンド サービスから UI を更新するにはどうすればよいでしょうか。(Stackoverflow にはいくつかの解決策があることは知っていますが、サービスから毎秒ブロードキャストを送信するのは少しやり過ぎのように思えます) Binding を使用する必要がありますか? バインディングの利点は何ですか? 現在、Song パスを含む Intent (startService(intent)) を使用してサービスを開始しています。

2番目の質問はどうですか?どうやってやるの?

4

2 に答える 2

2

自分でサービスを作ったと思います。したがって、それがどのように構築され、mediaPlayerリファレンスにアクセスする方法を知っています。あなたがする必要があるのはあなたのサービスを束縛されたサービスに変えることです。たぶんあなたはあなたのサービスが経由で開始されることを望むでしょうstartService(そうでなければバインドされたサービスはあなたの活動を生き残ることができません)、しかしその後、あなたはあなたの活動の中からそれにバインドしなければなりません。

バインドされると、 (定義する) IBinderを取得し、このIBinderを介してバインドされたアクティビティへのmediaPlayer参照をエクスポートできるようになります。その後、すべてが非常に簡単になります。リスナーをメディアプレーヤーに接続し、UIを更新します(UIスレッドで!)。

また、あなたはあなたのサービスを提案する必要があります。

于 2012-05-03T16:15:32.943 に答える
0

私は非常によく似た問題を解決していましたが、ミキシング/演奏の部分は自分で行いました。Android プレーヤー サービス部分のコードは-github-にあります。

アプリケーションとサービス間の通信 (ステータス バーに通知が表示されるフォアグラウンド サービスである必要があります。そうしないと、サイレントに強制終了または頻繁に一時停止される可能性があります) さまざまなアプローチを試した結果、

  • アクティビティ -> サービス - Messenger を使用
  • サービス -> アクティビティ / なんでも - BroadcastReceiver を使用

github のコードは大きすぎず (インポートを含めて合計 500 行未満)、インスピレーションを与えてくれます...

ところで。また、アクティビティの終了時にサービスを強制終了しないサービス バインディングも示しています。

于 2012-05-03T16:37:04.537 に答える