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 |
| Гаранција извршавања | Да, чак и након рестарта | Не — систем одлучује када |
| Мрежни приступ у позадини | Ограничен Doze режимом | Кроз 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 проверa није потребна — API сам обрађује ограничења система.
Push обавештења — главни механизам за окидање радњи без позадинског кода. На iOS-у су доступни PushKit за VoIP и Silent Push за ажурирање података. На Android-у — High Priority FCM и Notification Trampoline. WebSockets кроз Foreground Service — алтернатива за real-time апликације.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође