Подтвердить что ты не робот

Android: неявные намерения против широковещательных приемников

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

Оба получат намерения, как реагируют на системные сообщения, так почему нужен широковещательный приемник, а когда он используется, а не скрытый фильтр намерения и намерения, чтобы принять неявное намерение?

4b9b3361

Ответ 1

Широковещательные передачи - это просто сообщения, передаваемые любому слушающему. Они по своей сути небезопасны, и доставка к предполагаемому получателю не гарантируется, потому что на самом деле нет предполагаемого получателя. Например, широковещательная передача CONNECTIVITY_CHANGE делает это совершенно ясным: при изменении связи на устройстве Android многие приложения могут быть заинтересованы. Вместо ConnectivityManager, которые должны уведомить каждое приложение через конкретный Intent, он отправляет широковещательную передачу. Любое приложение, зарегистрировавшее интерес к этому событию, будет уведомлено. Любое приложение, которое не работает или не заботится... не будет.

An Intent отправляется, когда одно приложение или Activity хочет запустить другое, чтобы сделать что-то очень специфическое. Например, файловый менеджер может захотеть запустить средство просмотра изображений или видеоплеер. Ваше приложение может захотеть запустить очень специфический Activity в одном из ваших приложений и т.д. Коммуникация по конкретным намерениям (например, имя пакета и имя компонента) не может быть легко перехвачена, поэтому она несколько более безопасна. Самое главное, что существует только один и тот же "приемник" - если ни один из них не найден, Intent завершится с ошибкой.

Кроме того, a BroacastReceiver будет активным в пределах Activity или Service, и полученные широковещательные передачи обычно будут только изменять состояние и/или выполнять небольшие обновления пользовательского интерфейса... например, вы можете отключить несколько действий, если ваш подключение к Интернету отключено. Для сравнения, конкретный намерение обычно запускает новый Activity или переносит существующий на передний план.

Ответ 2

Я собираюсь составить список здесь всех различий между Неявные намерения (отправлен через startActivity()) и Трансляции (отправлен через sendBroadcast())

  • Широковещательные передачи по умолчанию могут влиять на несколько приложений одновременно (заказные трансляции могут быть нарушены). Напротив, Implicit Intents будут влиять только на одно приложение. Обратите внимание, что может быть множество возможностей приложений, которые могут быть затронуты, но в конечном итоге будет только один.
  • Неявные намерения обрабатываются через Intent-Filters, а широковещательные передачи обрабатываются через широковещательные приемники (хотя фильтры намерений также играют роль здесь). Во многих случаях я видел в Интернете, что трансляции сравниваются с Intent-фильтрами, и это не имеет смысла для меня.
  • Неявное намерение запускает действие или службу. В отличие от этого, Broadcast запускает широковещательный приемник. (Это, если вы думаете об этом, является основным различием между намерениями и трансляциями. Именно по этой причине трансляции не предназначены для выполнения слишком большой работы, и особенно не для работы с пользовательским интерфейсом!)
  • От веб-сайт разработчиков:

Нет возможности для BroadcastReceiver видеть или захватывать используемые намерения с startActivity(); Аналогично, когда вы транслируете намерение, вы будете никогда не находят или не запускают действие. Эти две операции семантически очень разные: начало деятельности с намерением - это первый план операция, которая изменяет то, с чем взаимодействует пользователь; трансляция Intent - это фоновая операция, в которой пользователь не как правило, известно.

Я добавлю больше, если найду что-нибудь еще.