Ответ 1
Я думаю, что LiveData
не поможет вам отправлять любые данные из Service
в другие компоненты.
Проблема с передачей от любого Service
к другим компонентам состоит в том, что вы обычно не получаете прямую ссылку на Service
, поэтому вы не можете напрямую "подписываться" на уведомления.
Service
работает в одном процессе, вы можете связать его, получить ссылку на объект Service
, а затем напрямую выполнить подписку. Однако это часто бывает излишним, и я не вижу, чтобы этот шаблон широко использовался.
В ваших примерах есть два механизма связи:
- Служба достигает статического объекта Application и устанавливает некоторые данные. Это сообщение через глобальное состояние и обычно считается анти-шаблоном.
- Связь через LocalBroadcastManager
Из приведенных выше двух механизмов я бы использовал только # 2 и избегал # 1 любой ценой.
Вернуться к LiveData
.
Чтобы иметь возможность получить объект LiveData
из Service
, вам понадобится ссылка на Service
. Это обычно невозможно, если вы не привязываете Service
к тому же процессу или не используете какой-то уродливый хак, который включает глобальное состояние.
Поэтому полезность LiveData
в этом контексте очень ограничена.
Кстати, в то время как LocalBroadcastManager в порядке, я считаю этот механизм слишком сложным и ограничивающим. Поэтому, если Service
работает в одном и том же процессе, я предпочитаю использовать EventBus
для связи из Service
с другими компонентами (или наоборот).
Пример такого сообщения вы можете увидеть в SQLite benchmarking application, который я написал несколько дней назад. В этом приложении TestService
публикует изменения статуса и результаты тестирования на EventBus
как липкие события, а TestActivity
подписывается на эти события.