Androidでよく使われるコンポーネント間通信方式

3735 ワード

1.startActivityForResult
2つのActivity間の1対1のインタラクションに適用されます.
2.LocalBroadcastManager
使用条件:ContextがあればOK.利点:送信側のContextはUIコンポーネントでなくてもよく、EventBusはできません.適用シーンは、バックグラウンドでサービス側のプッシュメッセージを受信した後、複数の関連ページがページをリフレッシュしたり、未読の赤い点を表示したりすることです.
使用方法:
2.1送信者:
    Intent intent = new Intent(ACTION_XXX);
    intent.putExtra(KEY_XXX, DATA_XXX);
    LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);

2.2受信者:
通常のブロードキャスト受信方式と同様に、ページ作成時にリスニング、ページ破棄時にリスニングの登録をキャンセルする必要があります.
    private void registerLocalBroadcast() {
        mLocalReceiver = new MyLocalBroadcastReceiver();
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mLocalReceiver, new IntentFilter(ACTION_XXX));
    }

    private void unregisterLocalBroadcast() {
        if (mLocalReceiver != null) {
            LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mLocalReceiver);
        }
    }

    public class MyLocalBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction() == ACTION_XXX) {
                //todo:    
            }
        }
    }
3.EventBus
ページ間の情報伝達と同期に適しています.適用レベルはActivity、Fragmentです.まず、Intentと同様にEventActionなどの転送用のデータ型を定義します.
public class EventAction {
    public EventType type;
    public Object data;

    public EventAction(EventType type) {
        this.type = type;
    }

    public EventAction(EventType type, Object data) {
        this.type = type;
        this.data = data;
    }

    public EventType getType() {
        return type;
    }

    public Object getData() {
        return data;
    }
}

ただし、EventTypeはintタイプのInterfaceであってもよいし、enumタイプであってもよい.IntentのActionに似ています.
3.1送信者:
EventAction action = new EventAction(EventType.EVENT_XXX, pushBean);
EventBus.getDefault().post(action);

3.2受信者:
各受信者は、登録インタフェースを呼び出して購読する必要があります.
    try {
        EventBus.getDefault().register(this);
    } catch (Exception e) {
        e.printStackTrace();
    }

次に、必要に応じて以下の4つの方法のいずれか1つまたは複数を実装し、一般的にはメッセージを受信した後にページをリフレッシュするために使用されるので、一般的な使用方法はonEventMainhread方法のみを実装することである.
    /**
     *                 
     *     onEventMainThread      ,                  ,
     * onEventMainThread   UI     ,       UI     ,   Android       ,
     *    Android    UI     UI,   onEvnetMainThread             。
     * @param action
     */
    public void onEventMainhread(EventAction action)
    {
        switch (action.getType()) {
            case EVENT_BASE:
                break;
            default:
                break;
        }
    }

    /**
     *                 
     *     onEvent      ,               ,
     * onEvent          ,                     。
     *        , onEvent           ,                  。
     * @param action
     */
    public void onEvent(EventAction action)
    {

    }

    /**
     *                 
     *     onEventBackgrond      ,        UI        ,
     *   onEventBackground         ,                 ,
     *   onEventBackground            。
     * @param action
     */
    public void onEventBackgroundThread(EventAction action)
    {

    }

    /**
     *                 
     *             ,             ,            onEventAsync.
     * @param action
     */
    public void onEventAsync(EventAction action)
    {

    }
4.RxBus
EventBusに似ています.RxJavaの付属機能です.プロジェクトにRxJavaパッケージが導入されている場合は、RxBusを使用すると最適です.
5.otto
OTTOはSquareが発売したライブラリで、原理はEventBusと同じで、実現方式も非常に似ています.異なるのは、受信者のコールバック方法が固定された4つではなく、@Subscribe注釈フラグによって受信者のコールバック方法を識別することである.