developer.android.com/guide/components/broadcast-exceptions
.
Как вы уже видели во время работы над этой главой,
трансляции, отправленные с разрешением на уровне подписи,
тоже лишены этого ограничения. Это позволяет вам
продолжать использовать автономные широковещательные
приемники, которые являются частными для вашего
приложения и любых других приложений, которые вы делаете с
использованием той же подписи. Поскольку только приложения
от одного разработчика имеют разрешение на отправку этих
трансляций, маловероятно, что в других частях системы
возникнут проблемы с производительностью, вызванные
такого рода трансляциями.
Для любознательных: проверка видимости фрагмента
Немного поразмыслив над реализацией PhotoGallery, мы
видим, что глобальный механизм широковещательной
рассылки
использовался
для
рассылки
интента
SHOW_NOTIFICATION
. При этом получение рассылки при
помощи разрешений ограничивается элементами, локальными
для вашего приложения. Возникает естественный вопрос:
почему я использую глобальный механизм, если просто
передаю данные в своем приложении? Разве не логичнее
использовать локальный механизм?
Дело в том, что мы намеренно пытались решить задачу
проверки того, виден фрагмент
PhotoGalleryFragment
или
нет. Для достижения цели мы воспользовались комбинацией
упорядоченных рассылок, автономных приемников и
динамически регистрируемых приемников. В Android
существует и более прямолинейное решение этой задачи.
Если говорить конкретно,
LocalBroadcastManager
не
подходит для широковещательных оповещений PhotoGallery и
проверки видимости фрагментов по двум причинам.
Во-первых,
LocalBroadcastManager
не поддерживает
упорядоченные широковещательные рассылки (хотя и
предоставляет механизм широковещательной рассылки с
блокировкой, а именно
sendBroadcastSync(Intent)
). Он не
подойдет
для
PhotoGallery,
потому
что
приемник
NotificationReceiver
должен гарантированно выполняться
последним в цепочке.
Во-вторых,
sendBroadcastSync(Intent)
не
поддерживает отправку и получение широковещательных
интентов в разных потоках. В PhotoGallery интент должен
отправляться из фонового потока (в
PollWorker.doWork()
), а
приниматься в главном потоке (динамическим приемником,
зарегистрированным
PhotoGalleryFragment
, в главном
потоке в
onStart(...)
).
На момент написания книги семантика потоковой доставки
LocalBroadcastManager
была плохо документирована, и, по
нашему опыту, ей не хватало логичности. Например, при
вызове
sendBroadcastSync(...)
из фонового потока все
необработанные рассылки будут выданы в фоновый поток
независимо от того, были ли они отправлены из главного
потока.
Это не значит, что механизм
LocalBroadcastManager
бесполезен. Просто этот инструмент не подходит для задач,
которыми мы занимались в этой главе.
Do'stlaringiz bilan baham: |