← Назад к вопросам
Какие знаешь виды сообщений у 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.