Help us understand the problem. What is going on with this article?

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

More than 5 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away