BroadcastReceiver
BroadcastReceiver — это компонент операционной системы Android, предназначенный для приёма и обработки широковещательных сообщений (broadcasts), отправляемых системой или другими приложениями. Он является одним из четырёх основных строительных блоков приложения Android наряду с Activity, Service и ContentProvider. BroadcastReceiver позволяет приложению реагировать на события, происходящие в системе или в других приложениях, без необходимости постоянного запуска приложения в фоновом режиме.
Принцип работы
BroadcastReceiver функционирует по модели подписки на сообщения. Приложение регистрирует получатель для определённого действия (action), например, для получения уведомления о низком уровне заряда батареи или о подключении к сети Wi-Fi. Когда система или другое приложение отправляет соответствующее широковещательное сообщение, Android runtime (среда выполнения) находит все зарегистрированные получатели, соответствующие данному действию, и вызывает их метод onReceive(). Этот метод выполняется в основном потоке приложения (UI thread) и должен завершаться как можно быстрее, обычно в течение 10 секунд, чтобы избежать зависания системы.
Жизненный цикл
Жизненный цикл BroadcastReceiver ограничен временем выполнения метода onReceive(). После возврата из этого метода получатель считается неактивным и может быть уничтожен системой в любой момент. Это означает, что выполнение длительных операций, таких как загрузка данных из сети или запись в базу данных, внутри onReceive() недопустимо. Для таких задач следует использовать Service или WorkManager.
Способы регистрации
BroadcastReceiver может быть зарегистрирован двумя способами: статически (в манифесте) и динамически (в коде приложения).
Статическая регистрация (в AndroidManifest.xml)
При статической регистрации получатель объявляется в файле AndroidManifest.xml с помощью тега <receiver>. Внутри тега указывается фильтр намерений (<intent-filter>), определяющий, какие действия будет обрабатывать получатель. Этот способ позволяет приложению получать широковещательные сообщения даже в том случае, если оно не запущено. Однако, начиная с Android 8.0 (API level 26), большинство неявных широковещательных сообщений (не адресованных конкретному приложению) не могут быть получены статически зарегистрированными получателями, за исключением специального списка исключений (например, BOOT_COMPLETED).
Динамическая регистрация (в коде)
Динамическая регистрация выполняется в коде приложения с помощью метода registerReceiver() класса Context. Получатель регистрируется на время активности компонента (например, Activity или Service). Этот способ даёт больше контроля над временем жизни получателя и позволяет реагировать на широковещательные сообщения только тогда, когда приложение активно. Для отмены регистрации используется метод unregisterReceiver(). Динамическая регистрация не ограничена ограничениями Android 8.0 и может обрабатывать любые неявные широковещательные сообщения.
Типы широковещательных сообщений
Широковещательные сообщения в Android делятся на два основных типа: обычные (normal broadcasts) и упорядоченные (ordered broadcasts).
Обычные широковещательные сообщения
Обычные сообщения доставляются всем зарегистрированным получателям одновременно, в неопределённом порядке. Они не могут быть прерваны или отменены получателем. Этот тип используется для уведомлений, не требующих приоритетной обработки.
Упорядоченные широковещательные сообщения
Упорядоченные сообщения доставляются получателям по очереди, в соответствии с их приоритетом, который задаётся в атрибуте android:priority фильтра намерений. Каждый получатель может передать результат своей обработки следующему получателю, отменить дальнейшую доставку сообщения или изменить его содержимое. Этот тип используется для сценариев, где важна последовательность обработки, например, для уведомлений о входящем звонке.
Применение
BroadcastReceiver широко используется для реализации различных функций в приложениях Android:
- Мониторинг состояния системы: получение уведомлений о включении/выключении экрана, подключении к сети, изменении уровня заряда батареи, установке/удалении приложений.
- Запуск фоновых задач: например, запуск Service при загрузке устройства (
BOOT_COMPLETED) или при подключении к зарядному устройству. - Взаимодействие между приложениями: отправка и получение пользовательских широковещательных сообщений для обмена данными между различными приложениями.
- Реагирование на системные события: обработка событий, таких как приём SMS-сообщения или входящий звонок (требует специальных разрешений).
Ограничения и особенности
С выходом Android 8.0 (API level 26) были введены значительные ограничения на использование статически зарегистрированных BroadcastReceiver для неявных сообщений. Это было сделано для повышения производительности и энергоэффективности системы, так как статическая регистрация приводила к запуску множества приложений для обработки каждого системного события. Вместо этого рекомендуется использовать динамическую регистрацию или альтернативные механизмы, такие как JobScheduler, WorkManager или JobIntentService.
Кроме того, BroadcastReceiver не может выполнять длительные операции. Если приложению требуется выполнить длительную работу после получения широковещательного сообщения, оно должно запустить Service или использовать WorkManager. В Android 14 (API level 34) были введены дополнительные ограничения на контекст, получаемый в onReceive(), что требует явного указания возможности запуска фоновых служб.
Примеры использования
Типичным примером использования BroadcastReceiver является приложение, которое должно синхронизировать данные при подключении к сети Wi-Fi. Приложение динамически регистрирует получатель для действия CONNECTIVITY_ACTION. При получении широковещательного сообщения о подключении к Wi-Fi, onReceive() проверяет тип подключения и, если это Wi-Fi, запускает Service для синхронизации данных.
Другим примером является приложение, которое должно отображать уведомление при низком заряде батареи. Для этого статически регистрируется получатель для действия ACTION_BATTERY_LOW. При получении сообщения, onReceive() создаёт и отображает уведомление в строке состояния.
Источники
- Документация Android Developers: Broadcasts Overview
- Документация Android Developers: BroadcastReceiver
- Книга «Android Programming: The Big Nerd Ranch Guide» (5-е издание)
- Статья «Android 8.0 Behavior Changes: Background Execution Limits»
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →