LoginSignup
27

More than 5 years have passed since last update.

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

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27