是否有可能 post
一个过程中的事件(例如内部 SyncAdapter
其中有 android:process=":sync"
清单属性)并在另一个(在常规应用程序UI中)接收它 玫瑰油 要么 EventBus?
我知道 Intent
和 BroadcastReceiver
工作得很好,可以跨多个流程进行通信,但我希望Otto / EventBus具有简单性和灵活性。
是否有可能 post
一个过程中的事件(例如内部 SyncAdapter
其中有 android:process=":sync"
清单属性)并在另一个(在常规应用程序UI中)接收它 玫瑰油 要么 EventBus?
我知道 Intent
和 BroadcastReceiver
工作得很好,可以跨多个流程进行通信,但我希望Otto / EventBus具有简单性和灵活性。
不,这是不可能的,如Otto,greenrobot的EventBus,和 LocalBroadcastManager
都是进程内解决方案。
您可以考虑简单地删除 android:process
清单中的属性,因此它都在一个进程中运行。
不,这是不可能的,如Otto,greenrobot的EventBus,和 LocalBroadcastManager
都是进程内解决方案。
您可以考虑简单地删除 android:process
清单中的属性,因此它都在一个进程中运行。
我知道这个问题有点陈旧,但似乎有一个库声称它可以处理与事件总线/ Rx样式架构的跨进程通信。
https://github.com/edisonw/PennStation
免责声明:我没有尝试过这个,只是发现了它,它声称做了这个问题的问题。
我知道答案已被接受,但我想我会写一些关于我是如何解决这个问题的,如果有人遇到这个问题并且很好奇代码的样子。
如果你正在使用Otto,我按照上面接受的答案删除了 android:process
从清单。我也按照这里提供的答案 如何使用Otto事件总线将事件从Service发送到Activity?,因为没有在主线程上运行而抛出了一个Bus异常。因此,我将两个答案组合在一起,并根据上面的链接在主线程上创建了一个总线。
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);
在我的应用程序片段中,我只是订阅了该事件。
当应用程序处于前台以及在应用程序被刷掉后在后台启动同步适配器时,这非常正常。
没有, 但你可以使用过境。例如使用 BroadcastReceiver
:在一个过程中,发送一个 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));
}
}
}