Programming Style

メニュー

初心者がアプリ開発者になるためのプログラミング学習サイト

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

android-common-top

通常のブロードキャストは、端末にインストールされている全アプリに対して送信されます。もし送信範囲をアプリ内に留めたい場合、LocalBroadcastManagerクラスを利用することで実現できます。ここでは、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﹕ 送信データ

 

 

広 告