← Назад к вопросам

Какие знаешь виды сообщений у BroadcastReceiver?

1.6 Junior🔥 191 комментариев
#Android компоненты

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Виды сообщений (Intents) для BroadcastReceiver

В Android система BroadcastReceiver предназначена для реаширования на системные или прикладные широковещательные сообщения (broadcasts). Эти сообщения передаются через объекты Intent и делятся на несколько ключевых категорий в зависимости от способа доставки, области видимости и источника.

1. По способу доставки (важнейшая классификация)

Явные (Explicit) Broadcasts

  • Направляются конкретному компоненту (например, определённому классу BroadcastReceiver) по его имени.
  • Область видимости: Только внутри приложения или для явно указанного компонента другого приложения.
  • Использование: Для внутренней коммуникации внутри приложения. Более безопасны и эффективны.
  • Пример создания Intent:
val explicitIntent = Intent(this, MyAppReceiver::class.java)
explicitIntent.action = "com.example.MY_ACTION"
sendBroadcast(explicitIntent)

Неявные (Implicit) Broadcasts

  • Рассылаются без указания конкретного получателя. Получаются всеми компонентами, которые имеют соответствующий Intent Filter.
  • Область видимости: Глобальная, могут быть получены любым приложением в системе (при наличии разрешений).
  • Важное ограничение: Начиная с Android 8.0 (API 26), для большинства неявных broadcast'ов введены ограничения. Их нельзя зарегистрировать статически в AndroidManifest.xml, за исключением нескольких освобождённых действий. Динамическая регистрация (в коде) работает.
  • Пример Intent Filter в манифесте (для разрешённого действия, например, BOOT_COMPLETED):
<receiver android:name=".MyBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

2. По источнику генерации

Системные Broadcasts (System Broadcasts)

  • Рассылаются операционной системой для уведомления о событиях: изменение режима полёта, низкий заряд батареи, завершение загрузки системы, смена локали.
  • Определяются константами в классе Intent, например Intent.ACTION_BATTERY_LOW, Intent.ACTION_SCREEN_ON.
  • Особенность: Часто требуют объявления соответствующих разрешений в манифесте.

Пользовательские Broadcasts (Custom Broadcasts)

  • Создаются и рассылаются самими приложениями для собственных нужд или межпроцессного взаимодействия.
  • Рекомендация: Для коммуникации внутри приложения всегда использовать явные broadcasts. Для общения между приложениями — использовать неявные, но с указанием пакета (setPackage()) или с применением разрешений для повышения безопасности.
  • Пример отправки пользовательского broadcast:
val customIntent = Intent("com.example.app.CUSTOM_EVENT")
// Для межприложенной коммуникации можно добавить данные
customIntent.putExtra("data_key", "value")
// Отправка с разрешением (если требуется)
sendBroadcast(customIntent, "com.example.permission.RECEIVE_EVENT")

3. По порядку доставки получателям

Обычные Broadcasts (Normal Broadcasts)

  • Отправляются с помощью sendBroadcast().
  • Порядок доставки: Неопределённый (unordered). Все получатели запускаются асинхронно и обычно одновременно, что может привести к race condition.
  • Эффективность: Высокая.

Упорядоченные Broadcasts (Ordered Broadcasts)

  • Отправляются с помощью sendOrderedBroadcast().
  • Порядок доставки: Получатели обрабатываются последовательно, согласно приоритету (android:priority в intent-filter). Это позволяет одному получателю прервать цепочку (abortBroadcast()), хотя этот метод устарел для обычных receiver'ов, но используется в legacy-компонентах, например, SmsReceiver.
  • Передача результата: Можно передавать данные по цепочке с помощью Bundle.
  • Пример:
val orderedIntent = Intent("com.example.ORDERED_ACTION")
sendOrderedBroadcast(
    orderedIntent,
    null, // permission
    MyResultReceiver(), // final receiver, получит результат последним
    null, // handler
    Activity.RESULT_OK,
    null, // initialData
    null // initialExtras
)

4. По области видимости (начиная с Android)

Глобальные Broadcasts

  • Традиционные broadcasts, видные всем приложениям в системе (как неявные системные или пользовательские).

Локальные Broadcasts (Local Broadcasts)

  • Механизм: Используется класс LocalBroadcastManager (до Android API 26) или, что предпочтительнее сейчас, механизм LiveData, Flow или Result API в рамках компонентов Architecture Components.
  • Назначение: Безопасная и эффективная коммуникация внутри одного процесса приложения. Не проходят через системный процесс, что исключает перехват другими приложениями и повышает производительность.
  • Пример с LocalBroadcastManager (устаревший, но для понимания):
// Регистрация
LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, IntentFilter("my-event"))

// Отправка
val localIntent = Intent("my-event")
LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent)
  • Современная альтернатива: Использование реактивных потоков данных (StateFlow, SharedFlow) или событийной шины с помощью ViewModel и LiveData.

Ключевые рекомендации по выбору типа

  • Внутри одного приложения: Используйте явные broadcasts, LocalBroadcastManager (для поддержки legacy кода) или, что лучше, реактивные паттерны (LiveData/Flow).
  • Между приложениями: Используйте неявные broadcasts, но обязательно защищайте их с помощью custom permissions и, начиная с Android 8.0, регистрируйте receiver'ы динамически (если broadcast не входит в список исключений).
  • Реакция на системные события: Используйте статическую регистрацию в манифесте для broadcast'ов из списка исключений (например, BOOT_COMPLETED). Для остальных событий (например, CONNECTIVITY_CHANGE) — динамическую регистрацию в активном компоненте (Activity/Service).
  • Производительность: Помните, что глобальные broadcasts — дорогостоящая операция для системы. Используйте их только при необходимости широкого оповещения.

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

Какие знаешь виды сообщений у BroadcastReceiver? | PrepBro