Могут ли события в автобусе быть замечены другим процессом?
Представьте, что я использую 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());