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Одно значениеНе применимоНизкая (deprecated с 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, INSTANCE? (package changes) — всего около десятка исключений. Все остальные неявные 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 for network state tracking
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", "Connection type: $connectionType")
    }
}

// Dynamic registration in 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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