Могут ли события шины быть видны другим процессам?

Представьте, что я использую otto для отправки событий по шине. Можно ли настроить другую службу, работающую в отдельном процессе, который может прослушивать те же события шины?

Я думаю, что, поскольку это еще одна JVM, события шины не будут доставлены другому процессу. проблема в otto. Я не уверен, использует ли Square намерения, которые могут проходить через несколько процессов или широковещательный приемник и т. д. Может ли кто-нибудь подтвердить?

По сути, скажем, у меня есть процесс 1, который передает событие на шину, и допустим, у меня есть некоторый метод/класс в процессе 2, который подписывается на это событие. Сможет ли процесс 2 получить событие?


person j2emanue    schedule 15.03.2015    source источник


Ответы (2)


К сожалению, я думаю, что нет. Учитывая, что это вилка 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.

person Fabio    schedule 23.03.2015

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());
person Newtron Labs    schedule 22.04.2017