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

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

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

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

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.

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());
Другие вопросы по тегам