Broadcast Receiver: що це, види Broadcast та принцип роботи

Автор: IT Sectr Опубліковано: 2026-06-17 Час читання: 7 хв

Broadcast Receiver — це компонент Android, який слухає та обробляє системні Broadcast-повідомлення, такі як зміна стану мережі, рівень заряду батареї, отримання SMS або встановлення додатку. Він запускається операційною системою при настанні події та виконує завдання в основному потоці або через фонову службу. Згідно з Android Developer Guide, 2026, Broadcast Receiver дозволяє додатку реагувати на глобальні системні події, навіть якщо він не запущений, що робить його ключовим механізмом для фонової обробки подій в екосистемі Android.

Головне

  • Broadcast Receiver — компонент Android для асинхронної обробки системних і користувацьких Broadcast-повідомлень.
  • Ordered Broadcast передається послідовно за пріоритетом і може бути перерваний будь-яким приймачем.
  • Normal Broadcast доставляється всім підписникам одночасно — порядок обробки не гарантовано.
  • Реєстрація буває статичною (в маніфесті) та динамічною (в коді через registerReceiver).
  • Обмеження Android 8+ забороняють статичну реєстрацію для багатьох неявних Broadcast, що знижує фонове навантаження.

Що таке Broadcast Receiver?

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, запущені з приймача.

Типи Broadcast в Android

Android підтримує два основних типи Broadcast: Normal Broadcast та Ordered Broadcast. Різниця полягає в порядку доставки та можливості перервати ланцюжок обробки. Крім того, Broadcast поділяються на системні (генеруються ОС) та користувацькі (створюються додатком).

Normal Broadcast

Normal Broadcast доставляється всім зареєстрованим приймачам асинхронно без гарантованого порядку. Система може обробляти такі Broadcast паралельно — кожен приймач отримує Intent у своєму потоці. Виклик abortBroadcast в Normal Broadcast не має ефекту: скасувати доставку іншим приймачам не можна.

Ordered Broadcast

Ordered Broadcast доставляється послідовно — кожному приймачу в порядку спадання атрибута android:priority (від 0 до 999). Після обробки приймач може передати результат наступному через setResultExtras або перервати ланцюжок викликом abortBroadcast. Це використовується для сценаріїв, де порядок обробки важливий — наприклад, SMS-приймачі.

Системні Broadcast

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

Broadcast Receiver можна зареєструвати двома способами: статично через AndroidManifest.xml або динамічно в коді через registerReceiver. Вибір залежить від сценарію: статична реєстрація працює навіть якщо додаток не запущено, динамічна — лише поки активний реєструючий компонент.

Статична реєстрація

Статична реєстрація оголошується в маніфесті тегом <receiver> всередині <application>. Для кожного приймача вказується клас-обробник та Intent-фільтр з діями, які він має перехоплювати. Система завантажує такі приймачі при настанні Broadcast навіть якщо додаток не запущено.

xml
<!-- 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 та новіше

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

Для фонових завдань, які раніше вирішувалися через Broadcast Receiver, Android рекомендує WorkManager (відкладені завдання з гарантією виконання), JobScheduler (періодичні завдання з урахуванням стану пристрою) та NotificationListenerService (моніторинг сповіщень). Ці компоненти працюють без обмежень Android 8 та оптимізовані для енергоспоживання.

Приклад Broadcast Receiver на Kotlin

Розглянемо створення Broadcast Receiver для відстеження підключення до мережі. Приймач буде отримувати Broadcast CONNECTIVITY_ACTION та логувати тип підключення. Для Android 8+ зареєструємо його динамічно, оскільки це неявний Broadcast, виключений зі статичної реєстрації.

kotlin
// 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 Receiver — це компонент Android для обробки системних та користувацьких Broadcast-повідомлень. Він отримує Intent в методі onReceive, який виконується в основному потоці, і повинен завершитися протягом 10 секунд. Для тривалих завдань використовуйте WorkManager або JobScheduler.

Чим відрізняється Normal Broadcast від Ordered Broadcast?

Normal Broadcast доставляється всім приймачам асинхронно та паралельно — порядок не гарантовано, abortBroadcast не працює. Ordered Broadcast передається послідовно за пріоритетом, кожен приймач може перервати ланцюжок або передати дані наступному через setResultExtras.

В чому різниця між статичною та динамічною реєстрацією?

Статична реєстрація (в маніфесті) дозволяє приймачу працювати навіть якщо додаток не запущено. Динамічна (через registerReceiver) працює лише поки активний реєструючий компонент. Починаючи з Android 8, багато неявних Broadcast вимагають динамічної реєстрації.

Які обмеження з’явилися в Android 8 для Broadcast Receiver?

Android 8 (API 26) заборонив статичну реєстрацію для більшості неявних Broadcast, таких як CONNECTIVITY_ACTION або ACTION_BATTERY_LOW. Винятки включають BOOT_COMPLETED, Alarm, час та деякі інші. Для фонових завдань замість Broadcast використовуйте WorkManager.

Як передати дані з Broadcast Receiver в Activity?

Використовуйте LiveData, StateFlow, EventBus або LocalBroadcastManager для передачі даних з onReceive в UI. Не намагайтеся оновлювати UI безпосередньо з onReceive — він виконується в основному потоці, але приймач не гарантує, що Activity видима. LocalBroadcastManager — застарілий варіант для внутрішньої комунікації.

Підсумки

  • Broadcast Receiver — системний компонент Android для прийому та обробки глобальних подій через Intent-повідомлення від ОС або інших додатків.
  • Normal Broadcast доставляється паралельно без гарантії порядку; Ordered Broadcast передається послідовно за пріоритетом з можливістю переривання ланцюжка.
  • Статична реєстрація в маніфесті працює для процесів, які ще не запущені, але обмежена в Android 8+ для більшості неявних Broadcast.
  • Динамічна реєстрація через registerReceiver вимагає обов’язкового виклику unregisterReceiver для запобігання витоку пам’яті.
  • System Broadcast включають BOOT_COMPLETED, CONNECTIVITY_ACTION, BATTERY_LOW — кожен містить додаткові дані в Extras Intent.
  • Час виконання onReceive обмежений 10 секундами — для тривалих завдань запускайте WorkManager або JobScheduler з приймача.
  • Альтернативи Broadcast Receiver в Android 8+: WorkManager для фонових завдань, JobScheduler для періодичних завдань, NotificationListenerService для моніторингу сповіщень.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також