[Android] LocalBroadcastManager:アプリ内だけにブロードキャストする

通常のブロードキャストは、端末にインストールされている全アプリに対して送信されます。もし送信範囲をアプリ内に留めたい場合、LocalBroadcastManagerクラスを利用することで実現できます。ここでは、LocalBroadcastManagerの使い方について説明します。
広 告
目次
- 1. LocalBroadcastManagerの概要
- 2. LocalBroadcastManagerでレシーバを登録する
- 3. LocalBroadcastManagerでブロードキャスト送信する
前提条件
動作確認端末
- Google Nexus 5 – 5.0.0 – API21(エミュレータ)
1. LocalBroadcastManagerの概要
LocalBroadcastManagerを使うと以下のことができます。
- ブロードキャストの送信範囲をアプリ内に限定できる
- ブロードキャストレシーバが受け取るデータをアプリ内ブロードキャストだけに限定することができる
このLocalBroadcastManagerを利用することで、以下の様な利点が得られます。
- ブロードキャストされたデータがアプリ外に届かないため、データ流出の心配がない
- 他アプリが送信したブロードキャストをレシーバは受け取らないため、セキュリティホールを突かれる心配がない
- 通常のブロードキャストと比較すると処理が効率化されている
LocalBroadcastManagerは、support-v4ライブラリに含まれているため、Android Studioでサポートライブラリを導入するを参考に「com.android.support:support-v4:22.2.0
」の事前に導入して置いてください。
2. LocalBroadcastManagerでレシーバを登録する
通常のブロードキャストレシーバを登録するためには、Context# registerReceiver()メソッドを使いますが、LocalBroadcastManagerを使用する場合は、LocalBroadcastManager#registerReceiver()メソッドを使用します。
以下にレシーバを登録するまでのサンプルコードを示します。
java/<packagename>/MainActivity.java
… import android.support.v4.content.LocalBroadcastManager; … public class MainActivity extends Activity { /** ブロードキャストマネージャ */ private LocalBroadcastManager mBroadcastReceiver; /** レシーバ */ private BroadcastReceiver mReceiver; … @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // LocalBroadcastManagerのインスタンスを取得 mBroadcastReceiver = LocalBroadcastManager.getInstance(getApplicationContext()); // レシーバをインスタンス化 // 今回MyReceiverクラスは内部クラスとして定義している mReceiver = new MyReceiver(); { // レシーバのフィルタをインスタンス化 final IntentFilter filter = new IntentFilter(); // フィルタのアクション名を設定する(文字列の内容は任意) filter.addAction("ACTION_NAME"); // レシーバを登録する mBroadcastReceiver.registerReceiver(mReceiver, filter); } } @Override protected void onDestroy() { super.onDestroy(); // レシーバの登録解除 mBroadcastReceiver.unregisterReceiver(mReceiver); } … /** レシーバクラス */ private static class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // ブロードキャストを受け取った時の処理を記述 // 今回はログを出力しています。 Log.i(getClass().getSimpleName(), intent.getStringExtra("KEY")); } } }
ソースコードの説明は、コード中のコメントを参照してください。
3. LocalBroadcastManagerでブロードキャスト送信する
通常のブロードキャスト送信を行うためには、Context# sendBroadcast ()メソッドを使いますが、LocalBroadcastManagerを使用する場合は、LocalBroadcastManager#sendBroadcast()メソッドを使用します。
java/<packagename>/MainActivity.java
final Intent intent = new Intent(); // フィルタのアクション名と合わせる必要があります intent.setAction("ACTION_NAME"); // 送信データを設定 intent.putExtra("KEY", "送信データ"); // アプリ内のみに対してブロードキャスト送信 mBroadcastReceiver.sendBroadcast(intent);
上記コードをボタン押下時などに実行してみると以下のようにLogcatが出力されます。
Logcatの出力内容
I/MyReceiver﹕ 送信データ