Что такое липкая трансляция?

90

Я встретил этот термин в документации по Android с сопутствующим определением

Это широковещательные рассылки, данные которых хранятся в системе после завершения, чтобы клиенты могли быстро получить эти данные, не дожидаясь следующей трансляции.

Что это означает? Может ли кто-нибудь пояснить его использование на конкретном примере? Я считаю, что мы должны запросить разрешение на использование этого намерения? Почему так?

<uses-permission android:name="android.permission.BROADCAST_STICKY"/> - Allows an application to broadcast sticky intents.
Шувик
источник
3
08 / фев / 2019, для всех, кто ищет липкую трансляцию и закончилась здесь, из официального документа Sticky broadcasts should not be used. They provide no security (anyone can access them), no protection (anyone can modify them), and many other problems. The recommended pattern is to use a non-sticky broadcast to report that something has changed, with another mechanism for apps to retrieve the current value whenever desired.
fangzhzh

Ответы:

110

Если Activity вызывает onPauseобычную трансляцию, получение трансляции может быть пропущено. Прилипшую трансляцию можно проверить после ее запуска onResume.

Обновление 23.06.2020

Прикрепленные трансляции устарели.

См. sendStickyBroadcastДокументацию .

Этот метод устарел на уровне API 21.

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

Воплощать в жизнь

Intent intent = new Intent("some.custom.action");
intent.putExtra("some_boolean", true);
sendStickyBroadcast(intent);

Ресурсы

Пол Берк
источник
Привет, меня путает липкая трансляция со статической регистрацией трансляции. Я только что где-то читал, что разница между регистрацией трансляции в файле манифеста и программной регистрацией заключается только в том, что следующий не отменяет регистрацию трансляции, но остается там, а последний отменяет регистрацию трансляции в методе onPause ().
Shaista Naaz
Примечание: в большинстве случаев следует избегать липких трансляций. См. Ссылку в ответе от @Nikhil_Katre для получения дополнительной информации
gMale
@Shaista: приемники манифеста работают, даже когда ваше приложение неактивно, тогда как программный приемник отвечает только тогда, когда приложение, в котором он зарегистрировано, запущено
gMale
@gmale Итак, если мы активны, и мы находимся в onPause () и вызвали unregisterReceiver () .. Получим ли мы трансляцию, когда возобновим работу onResume ()
Кушал
1
@PaulBurke Я не нашел имени Марка Мерфи в приведенной выше ссылке. Эта ссылка перенаправляет меня на вопрос, а не на точный ответ. Не могли бы вы обновить URL?
Vishal Chhodwani
11

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

Нарендра Мотвани
источник
8

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

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

Лу Морда
источник
3

Нормальное широковещательное намерение больше не доступно после того, как оно было отправлено и обработано системой. Если вы используете метод sendStickyBroadcast (Intent), Intent является липким, то есть отправляемое Intent остается после завершения трансляции.

вы ссылаетесь на мой блог: введите здесь описание ссылки

Арул Пандиан
источник
1
Я добавил обязательное раскрытие вашего авторства в блоге, на который вы ссылаетесь. С этого момента вы должны делать это сами, иначе ваши сообщения будут удалены как спам.
Эндрю Барбер,