4

サービスを使用してバックグラウンドで音楽を再生するメディア プレーヤー アプリに取り組んでいますが、サービスと通信するさまざまな方法について混乱しています。ボタンが一時停止に変わるように、サービスが再生中にアクティビティを通知するようにします。シーク バーも必要なので、サービスで現在再生されているものに関する情報が必要になります。

しばらくの間、さまざまな例を見てきましたが、それぞれが異なる方法で行っているようです。アクティビティをサービスにバインドするものもあれば、グローバル ブロードキャストを使用するだけのものもあれば、android の音楽プレーヤーが aidl を使用するものもあります。

メディア プレーヤーに関する限り、どの方法を使用すればよいですか? 他の方法では機能しないことを実行できるようになりますか? aidl を使用することで、彼らは何ができるようになりましたか?

4

1 に答える 1

8

過去数か月間、ほぼ同じ質問がありました。決定に入るいくつかの変数があるので、答えるのは本当に簡単な質問ではありません。おそらく、オプションの組み合わせを使用することになります。

Q:コミュニケーションは一方向ですか?サービスからアクティビティまで?
A:もしそうなら、LocalBroadcastManagerはあなたの友達です。これは非常に便利で、サービスからアクティビティへのコミュニケーションを行う最も簡単な方法の1つであることがわかりました。

Q:他のアプリケーションがブロードキャストを受信することを期待していますか?
A:その場合、LocalBroadcastManagerを使用できなくなります。代わりに、Context.sendBroadcast()でグローバルなものを使用する必要があります。

Q:アクティビティからサービスに返信することを期待していますか?
A:これは注意が必要です。サービスに何かを伝える必要があり、見返りを期待しない場合は、インテントを使用できます。ただし、サービスからの情報が必要な場合は、そのサービスへのバインドを確認する必要があります。

あなたのサービスにバインドするとき、アクティビティがサービスにバインドされている間、私は時々待機中のゲームをプレイしていることに気づきました。したがって、時間が重要な場合、これは少し難しい場合があります。サービスとの通信を期待する前に、サービスにバインドされていることを確認するために作業する必要があります。

あなたの例を考えて、あなたが他のアプリケーションがあなたの放送を受信することを期待していないと仮定すると、あなたはあなたのメディアプレーヤーサービス内で次のようなことをすることができます。

Intent broadcastIntent = new Intent(PlayerService.AUDIO_PLAYING);
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);

次に、プレーヤーアクティビティ内で、このインテントのリスナーとして登録する必要があります。たぶんあなたのonCreate()またはonStart()内。これは、アプリケーションによって異なります。

IntentFilter broadcastsToListenFor = new IntentFilter();
broadcastsToListenFor.addAction(PlayerService.AUDIO_PLAYING);
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, broadcastsToListenFor);

あなたのbroadcastReceiverは次のようになります...

// Set up broadcast receiver
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public synchronized void onReceive(Context context, Intent intent) {

        if(action.equals(PlayerService.AUDIO_PLAYING)) {

          // Set your play button image to pause here
        }
    }
};

最後に、onStop()またはonPause()メソッドでこれらのブロードキャストを受信しないようにアクティビティの登録を解除してください。繰り返しますが、特定のシナリオに応じて...

LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);

最近、これと非常によく似た作業を行いましたが、かなりうまく機能しています。それぞれのオプションが正しい選択である状況がおそらく見つかるので、それぞれのオプションをテストして試してみる価値があると思います。

于 2012-07-25T04:31:36.543 に答える