Что такое BroadcastReceiver?
BroadcastReceiver в Android — это компонент, который позволяет приложению реагировать на широковещательные сообщения (broadcasts), отправленные как системой, так и другими приложениями.
Это один из четырёх основных компонентов Android (наряду с Activity, Service и ContentProvider) и используется для прослушивания событий, происходящих в системе или приложении.
📡 Что такое broadcast
Broadcast — это событие, которое может быть разослано всем заинтересованным приложениям. Примеры системных broadcast-событий:
-
android.intent.action.BOOT_COMPLETED — устройство завершило загрузку.
-
android.intent.action.AIRPLANE_MODE — включён/выключен авиарежим.
-
android.net.conn.CONNECTIVITY_CHANGE — изменение состояния сети.
-
android.intent.action.BATTERY_LOW — низкий заряд батареи.
🔧 Как создать BroadcastReceiver
1. Создание класса:
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action
if (action == Intent.ACTION_BATTERY_LOW) {
// Реагируем на низкий заряд батареи
}
}
}
2. Регистрация
✅ Динамическая регистрация (в коде)
val receiver = MyReceiver()
val filter = IntentFilter(Intent.ACTION_BATTERY_LOW)
registerReceiver(receiver, filter)
Регистрация обычно происходит в onStart()/onResume(), а отмена — в onStop()/onPause():
unregisterReceiver(receiver)
📝 Статическая регистрация (в манифесте)
<receiver android:name=".MyReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
⚠️ С Android 8.0 (API 26) многие системные broadcast нельзя регистрировать в манифесте, если приложение не запущено. Их нужно регистрировать только программно (динамически).
📤 Отправка broadcast-сообщений
Локально внутри приложения:
val intent = Intent("com.example.MY_EVENT")
LocalBroadcastManager.getInstance(context).sendBroadcast(intent)
⚠️ LocalBroadcastManager устарел, вместо него лучше использовать Flow, SharedFlow или LiveData в современных проектах.
Глобально (системно):
val intent = Intent("com.example.MY_GLOBAL_EVENT")
sendBroadcast(intent)
🧠 Примеры использования
-
Реакция на смену сети (Wi-Fi, мобильная сеть).
-
Получение информации при загрузке устройства.
-
Слушание Bluetooth-событий.
-
Получение SMS/MMS (при наличии разрешений).
-
Внутреннее событие между компонентами приложения.
⚠️ Важные особенности
-
onReceive() выполняется быстро (в основном потоке) — нельзя запускать долгие операции или блокирующий код.
-
Для тяжёлых задач — запускай JobIntentService, Service или используй WorkManager.
-
Broadcast можно сделать:
-
нормальным — получатель просто реагирует.
-
ordered (упорядоченным) — приоритетные приёмники получают первым, можно прервать дальнейшую рассылку.
-
sticky (устарело) — сообщение сохраняется системой (например, BATTERY_CHANGED).
-
✅ Когда использовать BroadcastReceiver
-
Хочешь реагировать на системные события (батарея, сеть, загрузка).
-
Нужно настроить внутреннюю коммуникацию между частями приложения.
-
Обрабатываешь события даже при закрытом UI (но приложение должно быть запущено).
🗂 Альтернативы в современной архитектуре
-
LiveData, SharedFlow и StateFlow — для внутренних событий.
-
WorkManager — для фона и отложенных задач.
-
EventBus/RxJava/Coroutine Channel — для сложной логики и архитектурных решений.
Таким образом, BroadcastReceiver — это механизм подписки на события, позволяющий реагировать на изменения внутри системы или приложения. Он особенно полезен при создании приложений, зависящих от внешних условий, таких как сеть, заряд, загрузка устройства и т.д.