Android общается от Сервиса к Клиентам - PullRequest
2 голосов
/ 02 октября 2019

Я хотел бы сохранить ссылку на каждого клиента, который связывается с запущенным и связанным сервисом Android. Мой сервис НЕ находится в отдельном процессе.

У меня может быть несколько связанных клиентов, например - 1 действие и 2 фрагмента. Все они могут быть заинтересованы в комбинации различных событий, возвращающихся из Сервиса. В идеале я хотел бы зарегистрировать каждого клиента в Сервисе, когда он связывает, а затем перебирает каждого подключенного клиента и отправлять им каждое сообщение.

Сейчас я использую Binder для предоставления API Сервисаклиент, но я недоволен использованием широковещательных рассылок для отправки данных из службы обратно клиентам. Это чувствует себя так "свободно". Хотите знать, есть ли более сжатый и структурированный способ сделать это?

Обработчик сообщений - это один из способов, но я чувствую, что потеряю связующий API, через который клиенты в настоящее время получают доступ к API службы.

1 Ответ

2 голосов
/ 02 октября 2019

Подход Bound Service подробно здесь уместен. Вам не нужно беспокоиться о Handlers или даже Intents (как только клиент будет связан).

Обращаясь к примеру по данной ссылке: вы можете просто добавить функциональность в LocalService объект, например,

/** method for clients */
public int getRandomNumber() {
  return mGenerator.nextInt(100);
}

private Set<MyEventListener> mListeners = new HashSet<>();

/** A MyEventListener (your Activity, Fragment, etc.) calls this in its
 * onServiceConnected() method, on the reference it gets from getService(). */
public void registerListener(MyEventListener listener)
{
    mListeners.add(listener);
}

public void sendEvent()
{
    for(MyEventListener listener : mListeners)
    {
         listener.onEvent();
    }
}

... и так далее. Все методы выполняются синхронно в потоке пользовательского интерфейса. Все объекты (Services и клиенты (MyEventListener)) гарантированно будут иметь срок службы не менее, чем ServiceConnection. Кроме того, ServiceConnection не будет вызывать onServiceDisconnected() до тех пор, пока вы явно не отмените привязку, поскольку вы используете внутрипроцессный сервис.

...