Для реализации механизма широковещательной рассылки
событий может использоваться RxJava — библиотека
написания кода Java в «реактивном» стиле. Концепция
«реактивного» кода широка и выходит за рамки излагаемого
материала. В двух словах: она позволяет публиковать серии
событий и
подписываться на них, а также предоставляет
широкий выбор общих инструментов для выполнения
операций с сериями событий.
Разработчик создает Subject — объект, к которому можно
обращаться с запросами на публикацию событий, а также с
запросами на подписку:
val eventBus: Subject
=
PublishSubject.create
().toSerialized()
Этот объект используется для публикации событий:
val someNewFriend = "Susie Q"
val event = NewFriendAddedEvent(someNewFriend)
eventBus.onNext(event)
Пример подписки на события:
eventBus.subscribe { event: Any ->
if (event is NewFriendAddedEvent) {
val friendName = event.friendName
// Обновить UI
}
}
Преимущество решений на базе RxJava состоит в том, что
объект
eventBus
также является реализацией
Observable
,
представлением потока событий в RxJava. Это означает, что в
вашем распоряжении оказываются все средства для работы с
событиями в RxJava. Если вас заинтересует эта тема,
обращайтесь к вики на странице проекта RxJava:
github.com/ReactiveX/RxJava/wiki
.
Для любознательных: ограничения широковещательных
приемников
Как вы уже убедились, у широковещательных приемников есть
ограничения, объявленные в вашем Android-манифесте,
которые
могут привести к тому, что ваш приемник не будет
вызван. Такое поведение не распространяется на приемники,
которые
вы
регистрируете
динамически,
используя
registerReceiver(...)
, и применяется только тогда, когда
ваше приложение работает на Android Oreo (API уровня 26) и
более новых версиях Android.
Ограничения
для
автономных
широковещательных
приемников были введены с целью экономии ресурса
аккумулятора
и
повышения
производительности
на
устройствах пользователей. Если приемник зарегистрирован в
манифесте, и
приложение не работает, системе приходится
запускать процесс всякий раз, когда приемнику нужно передать
трансляцию. Этот процесс довольно незаметен, если
запущенных приложений одно или два, но если их много,
производительность сильно ухудшается.
Например, это может навредить работе пользователя, когда
есть приложения, выполняющие
автоматическое резервное
копирование новых фотографий, сделанных камерой. Это
может привести к запуску нескольких процессов в фоновом
режиме,
когда
пользователь
нажимает
кнопку
фотографирования в приложении для камеры, в результате
чего камера вообще начнет игнорировать пользователя.
Чтобы снять проблему производительности, в
новых
версиях Android, начиная с Android Oreo, неявные трансляции
больше не доставляются приемникам, объявленным в вашем
манифесте, за некоторым исключением (на явные трансляции
эти
ограничения не влияют, но следует помнить, что такие
трансляции передаются только на один приемник и
используются редко).
Из этого правила исключается ряд системных трансляций.
Приемники
BOOT_COMPLETE
,
TIMEZONE_CHANGED
и
NEW_OUTGOING_CALL
,
зарегистрированные
в
вашем
манифесте, все равно будут принимать эти трансляции. Дело в
том, что они либо редко отправляются, либо альтернативного
способа просто нет. Полный список исключений можно найти в
документации для разработчиков
Android на сайте
Do'stlaringiz bilan baham: