LocalBroadcastManagerでPub/Subパターンを実装する2017年07月09日(編集2017年07月09日)TweetAndroidアプリを作成するとき、ActivityやFragment間のデータ受け渡しでPub/Subパターンを利用したい場合があります。RxJavaといったライブラリを利用しなくても、LocalBroadcastManagerでPub/Subパターンを実装できます。この記事は、AndroidアプリでLocalBroadcastManagerを使ってPub/Subパターンを実装する方法を記載した記事です。記事の内容を実装したアプリケーションの動画です。Pub/Subパターンパブリッシャ(Pub)と呼ばれるメッセージの送信者が、特定の受信者、つまりサブスクライバ(Sub)を想定せずにメッセージを送るようにプログラムすることです。Pub/Subパターン使用例Activity画面に複数のFragmentやViewを用いて表示している時に、離れたコンポーネントのFragmentやviewにデータに送りたい場合に使います。LocalBroadcastManagerローカルオブジェクトにインテントのブロードキャストを登録して送信するヘルパークラスです。自分のアプリ内にブロードキャストするので、他のアプリにデータが漏れることはありません。libraryのクラスなので、ライブラリのインストールをしないで利用できます。Otto、EventBus、RxJavaを使う場合はライブラリのインストールが必要なので、アプリのサイズが大きくなります。いえ、LocalBroadcastManagerの機能は貧弱なので、何回ものPub/Subパターンが必要なアプリの場合は、素直にEventBusを利用した方が良いでしょう。アプリ設計この記事のサンプルでは、ActivityにbodyとfooterのFragmentをコミットし、bodyのFragmentから呼び出したダイアログから、footerのFragmentにデータをブロードキャストします。LocalBroadcastManagerを使ってデータ送信kotlinこの記事のサンプルは、Javaとkotlinの両方で実装します。Studio3未満で利用するには、{project_folder}/build.gradleに次のように記述します。}}kotlinのversionを最新でない1.1.1に指定しているのは、jackOptions(Java8)に対応するためです。続いてapp/build.gradleにも追記します。mavenCentral()}以上で準備は完了です。画面を管理するLocalBroadcastManagerActivityにBodyとFooterのFragmentをコミットします。FooterのFragmentは、BodyのFragmentから呼び出すDialogからBroadcastを受け取ります。BroadcastReceiver実装BroadcastReceiverはブロードキャストされた暗黙的Intentに応答するための仕組みです。BroadcastReceiverクラスを実体化し、intentを受け取るonReceiveメソッドをオーバーライドします。}};getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)はライフサイクルの状態を確認しています。something}onResumeメソッドでBroadcastReceiverの登録を行うので、onResumeが実行済みであることを確認しています。bgcolor));}Intent#getAction()メソッドでアクション名を取得します。アクション名は送信側でも利用するので、定数化した方がよいでしょう。送信したBroadcastとアクション名が一致した場合の処理を記述します。LocalBroadcastManager登録LocalBroadcastManagerの登録は、onResumeメソッドで行うのが一般的です。super.onResume();}LocalBroadcastManager#getInstanceメソッドはシングルトンです。registerReceiverメソッドはHashMapでBroadcastReceiverを登録するので、必ず対になるonPauseメソッドで解除処理を実装する必要があります。LocalBroadcastManager解除LocalBroadcastManagerの解除は、onPauseメソッドで行うのが一般的です。super.onPause();}registerReceiverメソッドで登録したBroadcastReceiverを削除します。続いて暗黙的Intentをブロードキャストする処理を実装します。BottomSheetDialogFragmentを継承したLocalBroadcastManagerBottomSheetDialogFragmentを実装します。Broadcast送信Broadcastの送信を実装します。BroadcastReceiverのonReceiveメソッドに暗黙的Intentを送信します。dismiss();}getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.CREATED)はライフサイクルの状態を確認しています。something}Acitivtyが生成されていることを確認するために、onCreateが実行済みであることを確認しています。R.color.colorBg);LocalBroadcastManager.getInstance(getActivity().getApplicationContext()).sendBroadcast(intent);Intentを生成し、アクション名とデータを設定します。アクション名は受信側と同じになります。sendBroadcastメソッドでintentを送信します。以上で実装は完了です。ビルド上記のコードの動作を確認してみましょう。LocalBroadcastManager(kotlin)intentがブロードキャストされて、fotterFragmentの背景色と文字列が変更されました。結論LocalBroadcastManagerは便利な機能です。Pub/Subパターンを何回も使う必要があるアプリの場合は、EventBusを導入した方が実装しやすいと思います。アプリの仕様によって決めることをお勧めします。