LocalBroadcastManagerによるサービスとの同期通信

More than 3 years have passed since last update.

同プロセス内でのActivityとService間のローカル通信に便利な

LocalBroadcastManagerというクラスがサポートライブラリにあります。

このクラスを使うとAIDLを利用せずにActivityとServiceの同期通信が簡単に行えます。

AIDLを使うまでもないような連携をしたい場合に便利だと思います。


LocalBroadcastManager#sendBroadcastSync(Intent)

同期通信するには LocalBroadcastManager#sendBroadcastSync(Intent) メソッドを使います。

sendBroadcast(Intent)と基本的には同じですが、このメソッドを使うと呼び出し元のスレッドをブロックし

直ちにレシーバーにIntentを投げます。

このメソッドを使い、受け取り側のレシーバーでも同じように sendBroadcastSync を使ってIntentを投げれば

呼び出し元に同期的に値を返すことができます。

※ 以下プログラムは色々省いてます。


Activity側


MainActivity.java


public class MainActivity extends Activity {

private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("", "receive : " + intent.getAction());
}
};

private void sendSyncBroadcast() {

Intent i = new Intent();
i.setAction("action1");

IntentFilter filter = new IntentFilter();
filter.addAction("action2");

LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(receiver, filter);
Log.d("", "Start Activity");
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcastSync(i);
Log.d("", "End Activity");
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(receiver);

}
}



Service側


TestService.java

public class TestService extends Service {

private BroadcastReceiver receiver;

@Override
public void onCreate() {
super.onCreate();

receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("action1")) {
Intent i = new Intent();
i.setAction("action2");

Log.d("", "Start Service");
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcastSync(i);
Log.d("", "End Service");
}
}
};

IntentFilter filter = new IntentFilter();
filter.addAction("action1");
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(receiver, filter);
}

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(receiver);
}
}



実行結果

何かしらのタイミングでActivityの sendSyncBroadcast() メソッドを実行すると

以下のような結果となり、Serviceと同期的に通信できていることがわかります。

Start Activity

Start Service
receive : action2
End Service
End Activity