同プロセス内での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