過去数か月間、ほぼ同じ質問がありました。決定に入るいくつかの変数があるので、答えるのは本当に簡単な質問ではありません。おそらく、オプションの組み合わせを使用することになります。
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);
最近、これと非常によく似た作業を行いましたが、かなりうまく機能しています。それぞれのオプションが正しい選択である状況がおそらく見つかるので、それぞれのオプションをテストして試してみる価値があると思います。