14

OttoまたはEventBuspostを使用して、あるプロセス (たとえばマニフェスト属性SyncAdapterを持つ内部) でイベントを発生さandroid:process=":sync"せ、別のプロセス (通常のアプリ UI 内) で受け取ることは可能ですか?

私はそれを知ってIntentおり、BroadcastReceiver複数のプロセスにわたる通信には問題なく機能しますが、Otto/EventBus でシンプルさと柔軟性を実現したいと考えています。

4

4 に答える 4

15

いいえ、それは不可能です。Otto、greenrobot の EventBusLocalBroadcastManagerはすべて進行中のソリューションです。

android:processすべてが 1 つのプロセスで実行されるように、単にマニフェストから属性を削除することを検討することもできます。

于 2014-08-29T12:25:19.310 に答える
1

いいえ、ただしトランジットを使用できます。使用例BroadcastReceiver: 1 つのプロセスでbroadcast、データと共に を送信し、次にメソッドの内部を介してBroadcastReceiver onReceive otto イベントを投稿します。

私のコードのように:

public class ReceiveMessageBroadcastReceiver extends BroadcastReceiver {

    public static final String ACTION_RECEIVE_MESSAGE
            = "me.drakeet.xxxxxx.ACTION_RECEIVE_MESSAGE";
    public static final String AGR_MESSAGE = "AGR_MESSAGE";


    // this method can be called in other processes
    public static void sendBroadcast(Context context, MessageContent content) {
        Intent intent = new Intent();
        intent.setAction(ACTION_RECEIVE_MESSAGE);
        intent.putExtra(AGR_MESSAGE, content);
        context.sendBroadcast(intent);
    }


    // this method will run in your default process, so you can post otto events to your
    // default process
    @Override public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(ACTION_RECEIVE_MESSAGE)) {
            MessageContent content = intent.getParcelableExtra(AGR_MESSAGE);
            Otto.getSeat().post(new PlayMessageReceivedEvent(content));
        }
    }
}
于 2015-12-17T14:18:28.253 に答える
0

答えがすでに受け入れられていることは知っていますが、誰かがこれに出くわし、コードがどのように見えるか興味がある場合に備えて、問題をどのように解決したかについて書きたいと思いました。

Otto を使用している場合はandroid:process、マニフェストから を削除して、上記の受け入れられた回答に従いました。ここで提供されている回答にも従いましたOttoイベントバスを使用してサービスからアクティビティにイベントを送信する方法は? 、メインスレッドで実行されていないためにバス例外がスローされていました。したがって、2つの答えを組み合わせて、上記のリンクに従ってメインスレッドで実行されるバスを作成しました。

public class MainThreadBus extends Bus {
    private final Handler mHandler = new Handler(Looper.getMainLooper());
    @Override
    public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    MainThreadBus.super.post(event);
                }
            });
        }
    }
}

次に、アプリケーションのどこでも使用できる Bus シングルトンを作成しました。

public final class BusProvider {
    private static final MainThreadBus BUS = new MainThreadBus();

    public static MainThreadBus getInstance() {
        return BUS;
    }

    private BusProvider() {
    }
}

私の SyncAdapter では、次のコードを使用してイベントを開始BusProvider.getInstance().post(event);し、アプリケーション フラグメントでは単にイベントをサブスクライブしました。

これは、アプリケーションがフォアグラウンドにあるとき、およびアプリケーションがスワイプされた後にバックグラウンドで同期アダプターが開始されたときに、完全に正常に機能しました。

于 2015-07-24T02:55:39.813 に答える