其他进程可以看到总线事件吗?

Can bus events be seen by other process?

假设我正在使用 otto 通过总线发送事件。是否可以设置另一个服务,该服务在可以侦听相同总线事件的单独进程上运行?

我认为因为它是另一个 JVM,所以总线事件不会传递给其他进程。问题出在 otto 我不确定 Square 是否正在使用可以跨越多个进程或广播接收器等的意图。有人可以确认吗?

基本上可以说我有进程 1,它将事件推送到总线上,并且可以说我在进程 2 中有一些 method/class 订阅了该事件。进程 2 能接收到事件吗?

不幸的是,我认为答案是否定的。鉴于它是一个 Guava 叉子,而且感觉设计起来很简单,我的猜测是它与 IPC 没有任何关系。

来自 Guava 页面 https://code.google.com/p/guava-libraries/wiki/EventBusExplained: "EventBus (...) is designed exclusively to replace traditional Java in-process event distribution using explicit registration. It is not a general-purpose publish-subscribe system, nor is it intended for interprocess communication."

我还有一个项目,其中使用 Otto 将消息从 IntentService 发送到 Activity。如果我更改 IntentService 使其具有专用进程,事情就会神奇地停止工作。添加时我可以看到区别:

<service android:name=".service.image.DownloadIntentService"  
    android:process=":myServiceProcess"
     />

此外,如果我正确理解它的体系结构,它甚至不会尝试将事件分派到不同的线程。它给发件人带来负担,让他们在发帖前坐在正确的线程上。

如果您真的必须坚持那种设计,我建议您可以让代理服务与您的目标目的地处于同一进程中,并通过通常的方式将来自 "remote" 服务的事件发送到您的代理IPC机制?对于简单的事情来说可能有点矫枉过正,但这就是我要走的路

我不打算得到明确的答案,因为我仍在学习曲线中。我希望我的墙纸服务位于专用进程中,使用 Otto 向我的 Activities/Services 发送和接收消息。

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) 
    {

    }
}

post 你可以我们:

IpcEventBus.getInstance().postEvent(new MyEvent());