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 хвилин для синхронізації даних. Час пробудження залежить від поведінки користувача — система аналізує, як часто він відкриває додаток. Користувач може вимкнути цю функцію для окремих додатків у Налаштуваннях — Загальні — 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також