Background Execution — механизм выполнения кода мобильного приложения в момент, когда оно не находится на переднем плане. Без этого механизма приложение приостанавливается системой при сворачивании. По данным Apple, 2026, iOS ограничивает фоновое время до 30 секунд, тогда как Android позволяет более гибкие сценарии через WorkManager и Foreground Service.
Главное
Background Execution — это способность приложения продолжать выполнение кода после того, как пользователь свернул его или переключился на другое приложение. Без специальных механизмов мобильная ОС переводит приложение в состояние Suspended (приостановлено) через несколько секунд после ухода в фон, освобождая процессор и память для активных приложений.
Мобильное приложение проходит через несколько состояний жизненного цикла: Foreground (активно), Background (в фоне), Suspended (приостановлено) и Terminated (завершено). Background — единственное состояние, в котором приложение может выполнять код без видимого интерфейса. iOS и Android по-разному определяют длительность и доступные операции в этом состоянии.
Фоновое выполнение необходимо для задач синхронизации данных, загрузки контента, обработки Push-уведомлений, геолокации в фоне и воспроизведения аудио. Синхронизация — наиболее частый сценарий: приложение отправляет данные на сервер или загружает обновления без участия пользователя.
Ограничения фонового выполнения обусловлены тремя факторами: энергопотребление, производительность устройства и приватность пользователя. Процессор и радио-модули (Wi-Fi, сотовые данные) потребляют наибольшую энергию — каждый фоновый процесс сокращает время работы от батареи.
Исследования Google показывают, что приложения, выполняющие фоновые задачи каждые 5 минут, сокращают время работы устройства на 20–30% за день. Даже оптимизированные фоновые операции с периодичностью раз в час оказывают заметное влияние, если таких приложений больше двух.
Каждое фоновое приложение занимает оперативную память. При её нехватке система выгружает приложения из памяти, что приводит к перезапуску при возврате пользователя. iOS использует алгоритм Jetsam — механизм принудительного завершения фоновых процессов при превышении лимита памяти. Android применяет LMK (Low Memory Killer) с аналогичным принципом.
Начиная с Android 10 и iOS 13, система требует от приложений декларировать цель фоновой работы. Android ввёл ограничение на запуск Broadcast Receiver в фоне. iOS требует указать Background Mode в Capabilities проекта. Пользователь может отключить фоновое выполнение для любого приложения в настройках.
| ОС | Версия | Ограничение | Влияние |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST запрещён | 67% фоновых Broadcast сломано |
| Android | 9.0 | Doze улучшен | Ограничение сетевых вызовов |
| Android | 12+ | Foreground Service ограничен | Запрет запуска из фона |
| iOS | 7+ | Background App Refresh | Периодические окна обновления |
| iOS | 13+ | BGTaskScheduler | Планирование вместо выполнения |
Android предоставляет несколько механизмов для фонового выполнения, каждый из которых решает свою категорию задач. WorkManager — рекомендуемый API для отложенных и периодических задач. Foreground Service — для немедленного выполнения с видимым уведомлением. JobScheduler — низкоуровневый аналог WorkManager.
WorkManager — часть Android Jetpack, обеспечивающая выполнение фоновых задач с гарантией завершения даже при перезагрузке устройства. API выбирает оптимальное время выполнения с учётом состояния сети, заряда батареи и режима Doze. WorkManager совместим с API 14+ и заменяет устаревшие AlarmManager и JobScheduler.
Когда приложению нужно выполнить задачу, видимую для пользователя (воспроизведение музыки, запись геолокации), используется Foreground Service. Сервис показывает постоянное уведомление в статус-баре и имеет более высокий приоритет — система не завершит его до окончания задачи. Начиная с Android 13, требуется разрешение POST_NOTIFICATIONS.
Начиная с Android 6.0, устройство переходит в режим Doze при бездействии. В этом режиме откладываются сетевые операции, синхронизация и JobScheduler. WorkManager автоматически адаптируется к Doze — задачи выполняются в ближайшее Maintenance Window, когда устройство выходит из сна для обслуживания.
iOS использует более строгий подход к фоновому выполнению. Background App Refresh — основной механизм периодического обновления данных. BGTaskScheduler — API для планирования задач с учётом состояния системы. Для длительных операций доступны Background Modes: audio, location, voip, fetch и processing.
Background App Refresh позволяет приложению просыпаться каждые 15–30 минут для синхронизации данных. Время пробуждения зависит от поведения пользователя — система анализирует, как часто он открывает приложение. Пользователь может отключить эту функцию для отдельных приложений в Settings — General — Background App Refresh.
Начиная с iOS 13, BGTaskScheduler заменил устаревшие performFetch и beginBackgroundTask. Приложение регистрирует задачи с идентификатором и минимальным интервалом, а система сама определяет оптимальное время выполнения. Задачи делятся на два типа: BGProcessingTask (длительные, 10+ минут) и BGAppRefreshTask (короткие, до 30 секунд).
iOS выделяет приложению ограниченное время на выполнение фоновой задачи — до 30 секунд для BGAppRefreshTask и до 10 минут для BGProcessingTask. По истечении лимита система принудительно завершает задачу. Разработчик должен вызывать обработчик завершения (expiration handler) для сохранения промежуточных результатов.
Рассмотрим практическую реализацию фонового выполнения на Android с помощью WorkManager. Пример синхронизации данных каждые 8 часов с учётом состояния сети. WorkManager гарантирует выполнение задачи даже при перезагрузке устройства.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "Данные синхронизированы")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Запуск периодической задачи каждые 8 часов
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(false)
.build()
val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(
8, TimeUnit.HOURS
).setConstraints(constraints).build()
WorkManager.getInstance(context).enqueue(syncRequest)
Для длительных операций, видимых пользователю, используйте Foreground Service. Пример загрузки файла с прогрессом в уведомлении. Сервис вызывает startForeground() с уведомлением, которое нельзя смахнуть. При завершении загрузки — stopForeground(STOP_FOREGROUND_REMOVE).
class DownloadService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, id: Int): Int {
startForeground(NOTIFICATION_ID, createNotification())
downloadFile()
stopForeground(STOP_FOREGROUND_REMOVE)
stopSelf()
return START_NOT_STICKY
}
private fun createNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Загрузка файла")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
На iOS фоновое выполнение настраивается через BGTaskScheduler. Пример регистрации и выполнения задачи обновления контента. Приложение должно зарегистрировать идентификатор задачи в Info.plist и вызвать submit в момент, когда задача должна быть запланирована.
import BackgroundTasks
func registerBackgroundTask() {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.app.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
}
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(
identifier: "com.app.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
}
func handleAppRefresh(task: BGAppRefreshTask) {
scheduleAppRefresh()
task.expirationHandler = {
// Сохранить промежуточные данные
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
Для длительных операций (очистка кэша, обработка данных) используйте BGProcessingTask. Система даёт до 10 минут на выполнение. Запускается только когда устройство на зарядке и подключено к Wi-Fi. Требует отдельного идентификатора в Info.plist и регистрации через register(forTaskWithIdentifier:).
func scheduleProcessing() {
let request = BGProcessingTaskRequest(
identifier: "com.app.cleanup"
)
request.requiresExternalPower = true
request.requiresNetworkConnectivity = true
request.earliestBeginDate = Date(timeIntervalSinceNow: 24 * 60 * 60)
try? BGTaskScheduler.shared.submit(request)
}
Android и iOS кардинально различаются в философии фонового выполнения. Android предоставляет гибкие инструменты с большим контролем, но требует от разработчика правильного выбора API. iOS ограничивает возможности, но гарантирует стабильную производительность и автономность для пользователя.
| Критерий | Android | iOS |
|---|---|---|
| Рекомендуемый API | WorkManager | BGTaskScheduler |
| Макс. время задачи | Не ограничено (Foreground Service) | 30 с / 10 мин (processing) |
| Периодические задачи | Да, через PeriodicWorkRequest | Да, через BGAppRefreshTask |
| Гарантия выполнения | Да, даже после перезагрузки | Нет — система решает when |
| Сетевой доступ в фоне | Ограничен Doze mode | Через URLSession с background config |
| Геолокация в фоне | Foreground Service + разрешение | Background Mode location + NSLocation |
| Аудио в фоне | Foreground Service с медиа-уведомлением | Background Mode audio + AVAudioSession |
WorkManager оптимален для задач, которые должны выполниться независимо от состояния приложения: синхронизация данных, отправка аналитики, обработка очередей. API гарантирует выполнение даже при выключении устройства — задача перепланируется после загрузки.
BGTaskScheduler подходит для задач, которые система может выполнить в любое удобное время: загрузка нового контента, обновление виджетов, очистка кэша. Не подходит для срочных операций — система откладывает задачу, если устройство в Doze или низкий заряд батареи.
Часто задаваемые вопросы
Background Execution — общее понятие, описывающее любой код, выполняющийся в фоне. Background Modes — конкретный механизм iOS, позволяющий приложению выполнять определённые типы фоновых операций: аудио, геолокация, VoIP, fetch. Android использует аналогичный подход через типы Foreground Service.
На iOS это стандартное ограничение для BGAppRefreshTask. Система принудительно завершает задачу по истечении лимита. На Android аналогичная ситуация происходит, когда приложение не использует WorkManager или Foreground Service — обычный Service завершается системой после ухода в фон.
На Android используйте WorkManager — он гарантирует выполнение даже после перезагрузки. На iOS гарантировать выполнение нельзя — система сама решает, когда запустить задачу. Единственный способ гарантировать — использовать Background Modes (audio, location) с видимым индикатором для пользователя.
На iOS вызовите UIApplication.shared.backgroundRefreshStatus — статус .available, .denied или .restricted. На Android используйте PowerManager.isIgnoringBatteryOptimizations() для проверки исключения из оптимизации батареи. Для WorkManager проверка не требуется — API сам обрабатывает ограничения системы.
Push-уведомления — основной механизм для триггера действий без фонового кода. На iOS доступны PushKit для VoIP и Silent Push для обновления данных. На Android — High Priority FCM и Notification Trampoline. WebSockets через Foreground Service — альтернатива для real-time приложений.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также