в чем разница между sendStickyBroadcast и sendBroadcast в Android

Ответы:

120

Вот что говорит Android SDKsendStickyBroadcast() :

Выполните sendBroadcast (Intent), который является «липким», то есть намерение, которое вы отправляете, остается после завершения трансляции, чтобы другие могли быстро получить эти данные с помощью возвращаемого значения registerReceiver (BroadcastReceiver, IntentFilter). Во всем остальном это ведет себя так же, как sendBroadcast (Intent).

Одним из примеров липкой трансляции, отправляемой через операционную систему, является ACTION_BATTERY_CHANGED. Когда вы вызываете registerReceiver()это действие - даже с помощью null BroadcastReceiver- вы получаете Intentпоследнюю трансляцию для этого действия. Следовательно, вы можете использовать это для определения состояния батареи без обязательной регистрации всех будущих изменений состояния батареи.

CommonsWare
источник
6
Насколько липким является намерение? Когда вы вызываете registerReceiver во второй раз, возвращает ли он то же намерение снова? (Предполагая, что у этого действия нет дополнительных намерений.)
phreed 03
22
@phreed: "Когда вы вызываете registerReceiver во второй раз, он снова возвращает то же намерение?" -- да. "выключить?" - они уходят, как и все в ОЗУ. "отключения экрана?" -- нет эффекта.
CommonsWare
1
Просто добавлю, что г-жа Хакборн категорически не рекомендует липкие трансляции: groups.google.com/d/msg/android-developers/8341SaXhvmY/… . Это старый пост, но, вероятно, он до сих пор применим
Mr_and_Mrs_D
1
@ Commonsware: я не могу понять вашу точку зрения. Объясните, используя пример обычного намерения и пример липкого намерения для того же сценария. Тогда мне будет полезно получить четкое представление
SIVAKUMAR.J
4
@Kushal: "Так какой же сейчас должна быть альтернатива липкой трансляции?" - Я не могу ответить на этот вопрос, так как не знаю, каков ваш вариант использования. Вы можете подумать о том, чтобы задать новый вопрос о переполнении стека, в котором вы описываете свои бизнес-требования, объясняете, как вы думали об их решении с помощью липких рассылок, и спрашиваете альтернативные способы решения той же проблемы.
CommonsWare
54

Типы : - локальный, нормальный, упорядоченный и липкий

Обычная трансляция

: - использовать sendBroadcast ()

: - асинхронная трансляция

: - трансляцию принимает любой приемник, а не какой-то определенный порядок

Заказанная трансляция

: - использовать sendOrderedBroadcast ()

: - синхронная трансляция

: - приемник принимает трансляцию в приоритетной базе

: - мы также можем просто прервать трансляцию в этом виде

Местное вещание

: - использовать, только если трансляция используется только внутри одного процесса

Липкая трансляция

: - нормальное широковещательное намерение больше не доступно после того, как оно было отправлено и обработано системой.

: - использовать sendStickyBroadcast (намерение)

: - соответствующее намерение является липким, то есть отправляемое вами намерение остается в силе после завершения трансляции.

: - из-за этого другие могут быстро получить эти данные через возвращаемое значение registerReceiver (BroadcastReceiver, IntentFilter).

: - кроме sendBroadcast (Intent).

Уманг Котари
источник
10

sendbroadcast() - обычная трансляция, но мы можем установить и приоритет.

sendstickybroadcast()- намерение, переданное с этим, будет закреплено для будущих пользователей, которые регистрируются с помощью кода (динамические приемники). Трансляция, которая останется на Android, будет повторно доставляться или ретранслироваться по будущим запросам от любых широковещательных приемников.

Когда кто-то отправляет липкую трансляцию с использованием, sendstickyBroadcast(intent);эта трансляция будет доступна для будущих пользователей, использующих динамические приемники.

Но теперь вы не должны использовать sendStickyBroadcast()метод, который устарел

Из документации Android:

Этот метод устарел на уровне API 21. Прикрепленные широковещательные рассылки использовать не следует. Они не обеспечивают безопасности (любой может получить к ним доступ), никакой защиты (любой может их изменить) и многих других проблем. Рекомендуемый шаблон - использовать неприлипающую трансляцию, чтобы сообщить, что что-то изменилось, с другим механизмом, позволяющим приложениям получать текущее значение в любое время.

Надеюсь, это поможет.

Раджеш
источник