1. fuuuuumin65

    Posted

    fuuuuumin65
Changes in title
+LocalBroadcastManagerによるサービスとの同期通信
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,106 @@
+
+同プロセス内での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
+
+```