想象一下,我正在使用 otto 通过总线发送事件。是否可以设置另一个在可以侦听相同总线事件的单独进程上运行的服务?
我认为因为它是另一个 JVM,所以总线事件不会被传递给另一个进程。问题出在otto我不确定square是否使用可以通过多个进程或广播接收器等的意图。有人可以确认吗?
基本上可以说我有进程 1 将事件推送到总线上,并且可以说我在进程 2 中有一些方法/类订阅了该事件。进程 2 是否能够接收事件?
IPC EventBus是一种允许用户通过 IPC 发送事件的解决方案。
将依赖项添加到您的build.gradle
compile 'com.newtronlabs.ipceventbus:ipceventbus:4.4.0'
实现接口以获取事件报告。
public class Listener implements IIpcEventBusConnectionListener, IIpcEventBusObserver
{
public Listener()
{
String targetApp = "com.packagename";
IIpcEventBusConnector connector =
ConnectorFactory.getInstance()
.buildConnector(context, this, targetApp);
connector.startConnection();
}
@Override
public void onConnected(IIpcEventBusConnector connector)
{
connector.registerObserver(this);
}
@Override
public void onEvent(IEventIpc event)
{
Log.d("ipceventbus", "Received event: "
+ event.getClass().getSimpleName());
}
@Override
public void onDisconnected(IIpcEventBusConnector connector)
{
}
}
要发布您可以我们:
IpcEventBus.getInstance().postEvent(new MyEvent());
不幸的是,我认为答案是否定的。鉴于它是一个 Guava 前叉,并且感觉设计使用简单,我猜它与 IPC 没有任何关系。
从 Guava 页面https://code.google.com/p/guava-libraries/wiki/EventBusExplained:“EventBus (...) 专门用于使用显式注册替换传统的 Java 进程内事件分发。它不是通用的发布-订阅系统,也不用于进程间通信。”
我还有一个项目,其中使用 Otto 将消息从 IntentService 发送到 Activity。如果我更改 IntentService 使其具有专用流程,事情就会神奇地停止工作。添加时我可以看到差异:
<service android:name=".service.image.DownloadIntentService"
android:process=":myServiceProcess"
/>
此外,如果我正确理解它的架构,它甚至不会尝试将事件分派到不同的线程。它使发件人有责任在发布之前坐在正确的线程上。
如果您真的必须坚持这种设计,我建议您可以在与目标目的地相同的进程中使用代理服务,并通过通常的 IPC 机制将事件从“远程”服务发送到您的代理?对于简单的事情可能有点矫枉过正,但这就是我的想法
我不打算有明确的答案,因为我仍在学习曲线上。我希望我的壁纸服务位于一个专门的进程中,使用 Otto 向我的活动/服务发送和接收消息。