2015年2月1日日曜日

LocalBroadcastManagerを使って、アプリ内部にのみブロードキャストを行う

LocalBroadcastManager

LocalBroadcastManagerはアプリ内の同プロセスに限定して、Broadcastを行う事ができます。
通常のsendBroadcastでブロードキャストと異なり、次のような利点があります。

プライベートなデータをアプリ外に残す心配がない。
他アプリがこのBroadcastを使う事ができない。(セキュリティホールの心配はしなくていい)
通常のBroadcastに比べ、より効率的アプリ内部へブロードキャストが行える。

注意点としては「同プロセス」に限定してブロードキャストを行います。言い換えれば、他プロセスにはブロードキャストは行えません。


用途

データ管理を行うModleクラスを作成する際、多くの人はServiceで実装すると思います。
Serviceを使うまでもない軽微なModleなら、ObserverとしてLocalBroadcastManagerを利用してデータの更新通知を行うのもありかと思います。


サンプルソース

こちらにJUnit付きのソースをアップしています。
https://github.com/baroqueworksdev/MyApiDemo_AndroidStudio/commit/cf08208cfd84b916480a08acf6f43fd791ca7da0

public class LocalBroadcastController {
    private LocalBroadcastManager mLocalBroadcastManager;
    private IntentFilter mIntentFilter;
    private OnLocalBroadcastController mOnLocalBroadcastController;

    public interface OnLocalBroadcastController {
        public void onReceive(Context context, Intent intent);
    }

    /**
     * Constructor
     *
     * @param context  Context
     * @param filter   Intent Filter which need to receive an action
     * @param listener onReceive
     */
    public LocalBroadcastController(Context context, IntentFilter filter, OnLocalBroadcastController listener) {
        mLocalBroadcastManager = LocalBroadcastManager.getInstance(context);
        mIntentFilter = filter;
        mOnLocalBroadcastController = listener;
    }

    /**
     * Register Receiver
     */
    public void registerReceiver() {
        mLocalBroadcastManager.registerReceiver(mReceiver, mIntentFilter);
    }

    /**
     * Unregister Receiver
     */
    public void unregisterReceiver() {
        mLocalBroadcastManager.unregisterReceiver(mReceiver);
    }


    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            mOnLocalBroadcastController.onReceive(context, intent);

        }
    };

}

0 件のコメント:

コメントを投稿