【问题标题】:Can bus events be seen by other process?其他进程可以看到总线事件吗?
【发布时间】:2015-03-15 23:51:03
【问题描述】:

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

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

基本上可以说我有进程 1,它将一个事件推送到总线上,假设我在进程 2 中有一些订阅该事件的方法/类。进程 2 能否接收事件?

【问题讨论】:

    标签: android process ipc square otto


    【解决方案1】:

    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());
    

    【讨论】:

      【解决方案2】:

      不幸的是,我认为答案是否定的。鉴于它是一个 Guava 前叉,并且感觉设计使用简单,我猜它与 IPC 没有任何关系。

      来自番石榴页面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 向我的活动/服务发送和接收消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多