Background Execution — mecanismul de executare a codului aplicației mobile atunci când aceasta nu se află în prim-plan. Fără acest mecanism, aplicația este suspendată de sistem la minimizare. Conform Apple, 2026, iOS limitează timpul în fundal la 30 de secunde, în timp ce Android permite scenarii mai flexibile prin WorkManager și Foreground Service.
Principalele
Background Execution — capacitatea aplicației de a continua executarea codului după ce utilizatorul a minimizat-o sau a trecut la o altă aplicație. Fără mecanisme speciale, sistemul de operare mobil trece aplicația în starea Suspended (suspendată) după câteva secunde de la intrarea în fundal, eliberând procesorul și memoria pentru aplicațiile active.
Aplicația mobilă trece prin mai multe stări ale ciclului de viață: Foreground (activă), Background (în fundal), Suspended (suspendată) și Terminated (terminată). Background — singura stare în care aplicația poate executa cod fără interfață vizibilă. iOS și Android definesc diferit durata și operațiile permise în această stare.
Execuția în fundal este necesară pentru sarcini de sincronizare a datelor, descărcare de conținut, procesare a notificărilor Push, geolocalizare în fundal și redare audio. Sincronizarea — cel mai frecvent scenariu: aplicația trimite date pe server sau descarcă actualizări fără participarea utilizatorului.
Limitările execuției în fundal sunt determinate de trei factori: consumul energetic, performanța dispozitivului și confidențialitatea utilizatorului. Procesorul și modulele radio (Wi-Fi, date mobile) consumă cea mai multă energie — fiecare proces în fundal reduce durata de funcționare a bateriei.
Cercetările Google arată că aplicațiile care execută sarcini în fundal la fiecare 5 minute reduc durata de funcționare a dispozitivului cu 20–30% pe zi. Chiar și operațiile optimizate în fundal cu o frecvență de o dată pe oră au un impact vizibil dacă există mai mult de două astfel de aplicații.
Fiecare aplicație în fundal ocupă memorie RAM. La insuficiența memoriei, sistemul descarcă aplicațiile din memorie, ceea ce duce la repornirea la revenirea utilizatorului. iOS utilizează algoritmul Jetsam — mecanism de terminare forțată a proceselor în fundal la depășirea limitei de memorie. Android folosește LMK (Low Memory Killer) cu un principiu similar.
Începând cu Android 10 și iOS 13, sistemul cere aplicațiilor să declare scopul lucrului în fundal. Android a introdus restricția de lansare a Broadcast Receiver în fundal. iOS necesită specificarea Background Mode în Capabilities ale proiectului. Utilizatorul poate dezactiva execuția în fundal pentru orice aplicație în setări.
| SO | Versiune | Limitare | Impact |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST interzis | 67% Broadcasturi în fundal stricate |
| Android | 9.0 | Doze îmbunătățit | Restricționarea apelurilor de rețea |
| Android | 12+ | Foreground Service limitat | Interzicerea lansării din fundal |
| iOS | 7+ | Background App Refresh | Ferestre periodice de actualizare |
| iOS | 13+ | BGTaskScheduler | Planificare în loc de executare |
Android oferă mai multe mecanisme pentru execuția în fundal, fiecare rezolvând propria categorie de sarcini. WorkManager — API-ul recomandat pentru sarcini amânate și periodice. Foreground Service — pentru executare imediată cu notificare vizibilă. JobScheduler — analog de nivel scăzut al WorkManager.
WorkManager — parte din Android Jetpack, asigurând executarea sarcinilor în fundal cu garanția finalizării chiar și după repornirea dispozitivului. API-ul selectează timpul optim de executare ținând cont de starea rețelei, nivelul bateriei și modul Doze. WorkManager este compatibil cu API 14+ și înlocuiește învechitele AlarmManager și JobScheduler.
Când aplicația trebuie să execute o sarcină vizibilă pentru utilizator (redare muzică, înregistrare geolocalizare), se folosește Foreground Service. Serviciul afișează o notificare permanentă în bara de stare și are prioritate mai mare — sistemul nu îl va termina până la finalizarea sarcinii. Începând cu Android 13, este necesară permisiunea POST_NOTIFICATIONS.
Începând cu Android 6.0, dispozitivul intră în modul Doze la inactivitate. În acest mod, operațiile de rețea, sincronizarea și JobScheduler sunt amânate. WorkManager se adaptează automat la Doze — sarcinile sunt executate în cea mai apropiată Maintenance Window, când dispozitivul iese din somn pentru întreținere.
iOS utilizează o abordare mai strictă a execuției în fundal. Background App Refresh — mecanismul principal de actualizare periodică a datelor. BGTaskScheduler — API pentru planificarea sarcinilor ținând cont de starea sistemului. Pentru operații lungi sunt disponibile Background Modes: audio, location, voip, fetch și processing.
Background App Refresh permite aplicației să se trezească la fiecare 15–30 de minute pentru sincronizarea datelor. Timpul de trezire depinde de comportamentul utilizatorului — sistemul analizează cât de des deschide acesta aplicația. Utilizatorul poate dezactiva această funcție pentru aplicații individuale în Settings — General — Background App Refresh.
Începând cu iOS 13, BGTaskScheduler a înlocuit învechitele performFetch și beginBackgroundTask. Aplicația înregistrează sarcini cu identificator și interval minim, iar sistemul determină singur timpul optim de executare. Sarcinile se împart în două tipuri: BGProcessingTask (lungi, 10+ minute) și BGAppRefreshTask (scurte, până la 30 de secunde).
iOS alocă aplicației timp limitat pentru executarea sarcinii în fundal — până la 30 de secunde pentru BGAppRefreshTask și până la 10 minute pentru BGProcessingTask. La depășirea limitei, sistemul forțează terminarea sarcinii. Dezvoltatorul trebuie să apeleze handlerul de expirare (expiration handler) pentru salvarea rezultatelor intermediare.
Să examinăm implementarea practică a execuției în fundal pe Android cu ajutorul WorkManager. Exemplu de sincronizare a datelor la fiecare 8 ore ținând cont de starea rețelei. WorkManager garantează executarea sarcinii chiar și după repornirea dispozitivului.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "Date sincronizate")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Pornirea sarcinii periodice la fiecare 8 ore
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)
Pentru operații lungi vizibile utilizatorului, folosește Foreground Service. Exemplu de descărcare a unui fișier cu progres în notificare. Serviciul apelează startForeground() cu o notificare care nu poate fi respinsă. La finalizarea descărcării — 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("Descărcare fișier")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
Pe iOS, execuția în fundal se configurează prin BGTaskScheduler. Exemplu de înregistrare și executare a sarcinii de actualizare a conținutului. Aplicația trebuie să înregistreze identificatorul sarcinii în Info.plist și să apeleze submit în momentul planificării sarcinii.
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 = {
// Salvează datele intermediare
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
Pentru operații lungi (curățarea cache-ului, procesarea datelor) folosește BGProcessingTask. Sistemul oferă până la 10 minute pentru executare. Se lansează doar când dispozitivul este la încărcător și conectat la Wi-Fi. Necesită un identificator separat în Info.plist și înregistrare prin 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 și iOS diferă radical în filosofia execuției în fundal. Android oferă instrumente flexibile cu mult control, dar necesită de la dezvoltator alegerea corectă a API-ului. iOS limitează posibilitățile, dar garantează performanță stabilă și autonomie pentru utilizator.
| Criteriu | Android | iOS |
|---|---|---|
| API recomandat | WorkManager | BGTaskScheduler |
| Timp max. sarcină | Nelimitat (Foreground Service) | 30 s / 10 min (processing) |
| Sarcini periodice | Da, prin PeriodicWorkRequest | Da, prin BGAppRefreshTask |
| Garanție executare | Da, chiar după repornire | Nu — sistemul decide când |
| Acces rețea în fundal | Limitat de Doze mode | Prin URLSession cu background config |
| Geolocalizare în fundal | Foreground Service + permisiune | Background Mode location + NSLocation |
| Audio în fundal | Foreground Service cu notificare media | Background Mode audio + AVAudioSession |
WorkManager este optim pentru sarcini care trebuie executate indiferent de starea aplicației: sincronizarea datelor, trimiterea analiticelor, procesarea cozilor. API-ul garantează executarea chiar și după oprirea dispozitivului — sarcina este replanificată după pornire.
BGTaskScheduler este potrivit pentru sarcini pe care sistemul le poate executa în orice moment convenabil: descărcarea conținutului nou, actualizarea widgeturilor, curățarea cache-ului. Nu este potrivit pentru operații urgente — sistemul amână sarcina dacă dispozitivul este în Doze sau bateria este scăzută.
Întrebări frecvente
Background Execution — concept general care descrie orice cod executat în fundal. Background Modes — mecanism specific iOS care permite aplicației să execute anumite tipuri de operații în fundal: audio, geolocalizare, VoIP, fetch. Android utilizează o abordare similară prin tipurile de Foreground Service.
Pe iOS aceasta este limita standard pentru BGAppRefreshTask. Sistemul forțează terminarea sarcinii la depășirea limitei. Pe Android, o situație similară apare când aplicația nu folosește WorkManager sau Foreground Service — Service-ul obișnuit este terminat de sistem după trecerea în fundal.
Pe Android folosește WorkManager — garantează executarea chiar și după repornire. Pe iOS nu se poate garanta executarea — sistemul decide singur când să lanseze sarcina. Singura modalitate de garanție — utilizarea Background Modes (audio, location) cu indicator vizibil pentru utilizator.
Pe iOS apelează UIApplication.shared.backgroundRefreshStatus — status .available, .denied sau .restricted. Pe Android folosește PowerManager.isIgnoringBatteryOptimizations() pentru verificarea excepției de la optimizarea bateriei. Pentru WorkManager verificarea nu este necesară — API-ul gestionează singur limitările sistemului.
Notificările Push — mecanismul principal pentru declanșarea acțiunilor fără cod în fundal. Pe iOS sunt disponibile PushKit pentru VoIP și Silent Push pentru actualizarea datelor. Pe Android — High Priority FCM și Notification Trampoline. WebSockets prin Foreground Service — alternativă pentru aplicațiile real-time.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și