Broadcast Receiver — це компонент Android, який слухає та обробляє системні Broadcast-повідомлення, такі як зміна стану мережі, рівень заряду батареї, отримання SMS або встановлення додатку. Він запускається операційною системою при настанні події та виконує завдання в основному потоці або через фонову службу. Згідно з Android Developer Guide, 2026, Broadcast Receiver дозволяє додатку реагувати на глобальні системні події, навіть якщо він не запущений, що робить його ключовим механізмом для фонової обробки подій в екосистемі Android.
Головне
Broadcast Receiver — це компонент Android, призначений для прийому та обробки Intent-повідомлень, які поширюються операційною системою або іншими додатками. На відміну від Activity та Service, Broadcast Receiver не має користувацького інтерфейсу — його завдання виконати коротке завдання при настанні події.
Broadcast Receiver працює через механізм Intent. Система або додаток надсилає Intent через sendBroadcast або sendOrderedBroadcast, а операційна система доставляє його зареєстрованим приймачам. Кожен приймач отримує Intent в методі onReceive, який виконується в основному потоці.
Згідно з Android Compatibility Definition Document, Broadcast Receiver повинен завершити onReceive протягом 10 секунд — інакше система вважає його завислим і завершує процес. Для тривалих фонових завдань використовуйте JobScheduler або WorkManager, запущені з приймача.
Android підтримує два основних типи Broadcast: Normal Broadcast та Ordered Broadcast. Різниця полягає в порядку доставки та можливості перервати ланцюжок обробки. Крім того, Broadcast поділяються на системні (генеруються ОС) та користувацькі (створюються додатком).
Normal Broadcast доставляється всім зареєстрованим приймачам асинхронно без гарантованого порядку. Система може обробляти такі Broadcast паралельно — кожен приймач отримує Intent у своєму потоці. Виклик abortBroadcast в Normal Broadcast не має ефекту: скасувати доставку іншим приймачам не можна.
Ordered Broadcast доставляється послідовно — кожному приймачу в порядку спадання атрибута android:priority (від 0 до 999). Після обробки приймач може передати результат наступному через setResultExtras або перервати ланцюжок викликом abortBroadcast. Це використовується для сценаріїв, де порядок обробки важливий — наприклад, SMS-приймачі.
Android генерує безліч системних Broadcast: ACTION_BOOT_COMPLETED (завантаження пристрою), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED та інші. Кожен Intent містить додаткові дані в Extras — рівень заряду, тип підключення, ім’я пакета.
| Тип Broadcast | Порядок | abortBroadcast | Продуктивність |
|---|---|---|---|
| Normal | Не гарантовано | Не працює | Висока (паралельна) |
| Ordered | За пріоритетом | Працює | Середня (послідовна) |
| Sticky | Одне значення | Не застосовно | Низька (застарілий з API 21) |
Sticky Broadcast — застарілий тип, який зберігав останнє надіслане значення. Натомість використовуйте LiveData, StateFlow або спільні SharedPreferences для зберігання останнього стану.
Broadcast Receiver можна зареєструвати двома способами: статично через AndroidManifest.xml або динамічно в коді через registerReceiver. Вибір залежить від сценарію: статична реєстрація працює навіть якщо додаток не запущено, динамічна — лише поки активний реєструючий компонент.
Статична реєстрація оголошується в маніфесті тегом <receiver> всередині <application>. Для кожного приймача вказується клас-обробник та Intent-фільтр з діями, які він має перехоплювати. Система завантажує такі приймачі при настанні Broadcast навіть якщо додаток не запущено.
<!-- Static Broadcast Receiver registration in manifest -->
<receiver android:name=".BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Динамічна реєстрація виконується методом registerReceiver в коді Activity, Service або Fragment. Приймач живе лише поки живий компонент, який його зареєстрував. Обов’язково викликайте unregisterReceiver в onPause або onDestroy — інакше станеться витік пам’яті, і система може завершити процес.
Для Ordered Broadcast порядок доставки визначається атрибутом android:priority. Приймач з вищим пріоритетом отримує Intent раніше. Якщо після обробки він викликає abortBroadcast, приймачі з нижчим пріоритетом не отримають Intent. Для статичних приймачів пріоритет задається в Intent-фільтрі маніфесту.
Приймачі в Ordered Broadcast можуть передавати дані наступному в ланцюжку через setResultExtras або setResultData. Це дозволяє організувати конвеєрну обробку: перший приймач збагачує Intent додатковими даними, другий використовує їх, третій завершує ланцюжок. Метод getResultExtras читає дані, передані попереднім приймачем.
Для Normal Broadcast порядок не гарантовано, тому всі приймачі отримують вихідний Intent без змін. Якщо вам потрібно, щоб приймачі впливали один на одного — використовуйте sendOrderedBroadcast замість sendBroadcast.
Android 8 (API 26, Oreo) ввів суттєві обмеження на фонові Broadcast. Більшість неявних (implicit) Broadcast — тих, що не адресовані конкретному додатку — більше не працюють зі статичною реєстрацією. Система блокує приймачі, зареєстровані в маніфесті, для таких дій як CONNECTIVITY_ACTION або ACTION_BATTERY_LOW.
Google зафіксував список Broadcast, які продовжують працювати зі статичною реєстрацією: BOOT_COMPLETED, TIME_TICK, Alarm та зміни пакетів — всього близько десятка винятків. Всі інші неявні Broadcast тепер вимагають динамічної реєстрації через Context.registerReceiver, яка працює лише коли додаток у foreground.
Для фонових завдань, які раніше вирішувалися через Broadcast Receiver, Android рекомендує WorkManager (відкладені завдання з гарантією виконання), JobScheduler (періодичні завдання з урахуванням стану пристрою) та NotificationListenerService (моніторинг сповіщень). Ці компоненти працюють без обмежень Android 8 та оптимізовані для енергоспоживання.
Розглянемо створення Broadcast Receiver для відстеження підключення до мережі. Приймач буде отримувати Broadcast CONNECTIVITY_ACTION та логувати тип підключення. Для Android 8+ зареєструємо його динамічно, оскільки це неявний Broadcast, виключений зі статичної реєстрації.
// Broadcast Receiver для відстеження стану мережі
class NetworkReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = cm.activeNetwork
val caps = cm.getNetworkCapabilities(network)
val connectionType = when {
caps?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true -> "WiFi"
caps?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> "Cellular"
else -> "Disconnected"
}
Log.d("NetworkReceiver", "Тип підключення: $connectionType")
}
}
// Динамічна реєстрація в Activity
class MainActivity : AppCompatActivity() {
private val networkReceiver = NetworkReceiver()
override fun onStart() {
super.onStart()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver, filter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(networkReceiver)
}
}
Обов’язково скасовуйте реєстрацію приймача в onStop — якщо Activity піде в бекграунд, але приймач залишиться зареєстрованим, система не зможе звільнити ресурси. Для Service використовуйте onDestroy. У фрагментах реєструйте приймач в onStart та скасовуйте в onStop, дотримуючись життєвого циклу фрагмента.
Часті запитання
Broadcast Receiver — це компонент Android для обробки системних та користувацьких Broadcast-повідомлень. Він отримує Intent в методі onReceive, який виконується в основному потоці, і повинен завершитися протягом 10 секунд. Для тривалих завдань використовуйте WorkManager або JobScheduler.
Normal Broadcast доставляється всім приймачам асинхронно та паралельно — порядок не гарантовано, abortBroadcast не працює. Ordered Broadcast передається послідовно за пріоритетом, кожен приймач може перервати ланцюжок або передати дані наступному через setResultExtras.
Статична реєстрація (в маніфесті) дозволяє приймачу працювати навіть якщо додаток не запущено. Динамічна (через registerReceiver) працює лише поки активний реєструючий компонент. Починаючи з Android 8, багато неявних Broadcast вимагають динамічної реєстрації.
Android 8 (API 26) заборонив статичну реєстрацію для більшості неявних Broadcast, таких як CONNECTIVITY_ACTION або ACTION_BATTERY_LOW. Винятки включають BOOT_COMPLETED, Alarm, час та деякі інші. Для фонових завдань замість Broadcast використовуйте WorkManager.
Використовуйте LiveData, StateFlow, EventBus або LocalBroadcastManager для передачі даних з onReceive в UI. Не намагайтеся оновлювати UI безпосередньо з onReceive — він виконується в основному потоці, але приймач не гарантує, що Activity видима. LocalBroadcastManager — застарілий варіант для внутрішньої комунікації.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також