Încărcarea datelor, sincronizarea conținutului, trimiterea analizelor — multe sarcini nu necesită participarea activă a utilizatorului. Cu toate acestea, dispozitivele mobile limitează munca în fundal pentru a economisi bateria și a menține performanța. Sarcinile în fundal (background tasks) sunt mecanisme care permit unei aplicații să execute cod atunci când utilizatorul nu o vede. În acest articol vom analiza WorkManager, BGTaskScheduler, Foreground Service și particularitățile Doze Mode. Mai multe detalii în documentația oficială WorkManager.
Puncte cheie
O sarcină în fundal este orice cod executat atunci când aplicația nu este în prim-plan (ecran activ). Aceasta poate include: sincronizarea periodică a datelor cu serverul, descărcarea fișierelor mari, procesarea notificărilor push, urmărirea geolocației, actualizarea widgeturilor. Fiecare platformă are propriile restricții privind munca în fundal: iOS este mai strict (10–30 minute de timp în fundal), Android este mai permisiv dar a înăsprit regulile de la versiunea 9.
Arhitectura sarcinilor în fundal se bazează pe trei niveluri: (1) sarcini imediate — se execută imediat (Foreground Service); (2) sarcini amânate — se execută în condiții potrivite (WorkManager, BGTaskScheduler); (3) sarcini periodice — se repetă la un interval stabilit. Alegerea nivelului corect determină dacă sarcina va fi finalizată la timp și dacă va duce la respingerea aplicației din magazin.
Pe ambele platforme, Google/Apple recomandă insistent utilizarea API-urilor declarative în locul gestionării directe a firelor de execuție în fundal. WorkManager pe Android și BGTaskScheduler pe iOS permit sistemului să distribuie optim munca în fundal între aplicații, grupând sarcinile pentru a economisi energie. La IT Sectr, începem întotdeauna proiectarea arhitecturii de fundal prin analiza cerințelor de frecvență și urgență a actualizărilor.
iOS oferă mai multe mecanisme pentru munca în fundal. Background Fetch — actualizare periodică a conținutului cu un interval determinat de sistem (nu de dezvoltator). Aplicația primește o fereastră de ~30 de secunde pentru a descărca date noi. Background Fetch se activează prin Capabilities → Background Modes → Background Fetch și se implementează în AppDelegate: application(_:performFetchWithCompletionHandler:).
BGTaskScheduler este API-ul modern pentru iOS 13+, care înlocuiește Background Fetch. Dezvoltatorul înregistrează o sarcină cu un identificator, iar sistemul o execută când condițiile sunt potrivite. BGAppRefreshTask — pentru actualizări scurte de conținut; BGProcessingTask — pentru sarcini lungi (curățarea cache-ului, sincronizarea bazei de date). Sarcinile sunt înregistrate la pornirea aplicației, iar sistemul planifică execuția lor luând în considerare starea bateriei, rețeaua și activitatea utilizatorului.
Background Modes — o listă de moduri care permit munca în fundal pentru scenarii specifice: Audio (redare în fundal), Location (GPS), VoIP (apeluri prin PushKit), BLE (conectare la dispozitive Bluetooth), Processing (sarcini lungi prin BGTaskScheduler). Fiecare mod necesită justificare în timpul revizuirii App Store. Utilizarea modurilor fără necesitate reală este o cauză comună de respingere a aplicației.
Significant Location Change — un mecanism pentru aplicații care nu au nevoie de geolocație constantă, dar trebuie să știe despre mișcări semnificative ale utilizatorului (peste 500 de metri). Sistemul trezește aplicația la schimbarea turnului celular. Acest mecanism economisește semnificativ bateria în comparație cu GPS-ul constant.
Android oferă cel mai bogat set de API-uri pentru sarcini în fundal, dar de la versiunea 8.0 (API 26) regulile au devenit mai stricte. WorkManager este soluția recomandată de Google pentru toate tipurile de sarcini în fundal. WorkManager garantează executarea sarcinii chiar și după repornirea dispozitivului (prin BootReceiver) și suportă lanțuri de sarcini, LiveData/Flow observabile și compatibilitate inversă până la API 14.
WorkManager folosește Worker — o clasă de bază cu metoda doWork(). Constraints definește condițiile de execuție: NetworkType.CONNECTED, BatteryNotLow, StorageNotLow. PeriodicWorkRequest — pentru sarcini periodice cu un interval minim de 15 minute. WorkManager se adaptează automat la Doze Mode și App Standby, grupând sarcinile în ferestre de întreținere. Exemplu de Worker simplu:
class SyncWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
val repository =
Injection.provideRepository(applicationContext)
repository.syncData()
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Запланировать задачу
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(constraints)
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
JobScheduler — un API mai vechi (Android 5+, API 21). Planifică sarcini cu condiții specificate (rețea, încărcare, inactivitate). Limitare: nu suportă repornirea dispozitivului (necesită BootReceiver) și nu are stare observabilă. JobScheduler este potrivit pentru sarcini simple în proiecte moștenite; pentru proiecte noi, utilizați WorkManager.
Foreground Service — un serviciu pe care utilizatorul îl vede printr-o notificare persistentă (ongoing notification). Folosit pentru: redare muzică, urmărire GPS, descărcare fișiere mari. Foreground Service are prioritate ridicată — sistemul nu îl va ucide când memoria este insuficientă. Începând cu Android 13, este necesară permisiunea FOREGROUND_SERVICE_SPECIAL_USE pentru unele tipuri. O alternativă este WorkManager cu ForegroundServiceOption (sarcini lungi).
AlarmManager — pentru sarcini care trebuie executate la o oră exactă (alarmă, memento). AlarmManager poate trezi dispozitivul din Doze Mode (setAlarmClock). Nerecomandat pentru sincronizare regulată din cauza consumului mare de energie. Pentru sarcini periodice, utilizați WorkManager, iar AlarmManager numai când ora exactă este critică.
| Scenariu | iOS | Android |
|---|---|---|
| Actualizare periodică conținut | BGAppRefreshTask (BGTaskScheduler) | WorkManager (PeriodicWorkRequest) |
| Sarcină lungă în fundal | BGProcessingTask | WorkManager + ForegroundService |
| Redare audio | Background Audio Mode | Foreground Service |
| Urmărire GPS | Significant Location Change / Background Location | Foreground Service + FusedLocationProvider |
| VoIP / Apeluri | PushKit + CallKit | ConnectionService + Foreground Service |
| Ora exactă (alarmă) | UNNotificationRequest (calendar) | AlarmManager |
| Procesare push (fundal) | Notification Service Extension | FirebaseMessagingService (onMessageReceived) |
Doze Mode este un mod de economisire a energiei în Android care afectează executarea sarcinilor în fundal. Introdus în Android 6.0 (API 23). Când dispozitivul nu se încarcă, ecranul este stins și dispozitivul este nemișcat, Doze Mode blochează cererile de rețea, amână JobScheduler și WakeLock. Periodic, Doze deschide ferestre de întreținere — intervale scurte în care aplicațiile pot executa sarcini amânate. De la Android 7.0 (API 24), Doze se activează când ecranul este stins, nu doar când este complet nemișcat.
App Standby — un mod în care aplicațiile neutilizate sunt puse în așteptare. Dacă o aplicație nu are notificări active și nu a fost deschisă de câteva zile, este plasată într-un Standby Bucket: activ (active), working, frequent, rare. Cu cât aplicația este mai puțin utilizată, cu atât restricțiile sunt mai stricte: cererile de rețea sunt amânate, sincronizarea este blocată, JobScheduler nu rulează.
WakeLock — un mecanism care menține dispozitivul treaz (împiedică adormirea). Folosit pentru a finaliza operațiuni importante. WakeLock trebuie eliberat (release) după finalizarea sarcinii, altfel bateria se va descărca în câteva ore. WakeLock nu funcționează în Doze Mode — sistemul îl ignoră. Lucrul cu WakeLock pe Android 8+ necesită permisiunea WAKE_LOCK și gestionarea corectă a ciclului de viață.
La IT Sectr, luăm în considerare Doze Mode și App Standby în faza de proiectare. WorkManager gestionează automat aceste moduri, dar pentru Foreground Service trebuie planificată gestionarea corectă a tranzițiilor către Doze. Se recomandă testarea muncii în fundal pe dispozitive reale cu modul de economisire a energiei activat și după perioade lungi de inactivitate.
La proiectarea sarcinilor în fundal, urmați aceste sfaturi. 1. Utilizați întotdeauna WorkManager pentru proiecte Android noi. Rezolvă problemele de compatibilitate, Doze Mode și repornirea dispozitivului. 2. Pe iOS, preferați BGTaskScheduler în loc de Background Fetch pentru iOS 13+. 3. Utilizați Foreground Service numai când sarcina necesită cu adevărat o notificare vizibilă. 4. Nu abuzați de WakeLock — consumă bateria și poate duce la respingerea aplicației. 5. Testați sarcinile în fundal în Doze Mode: adb shell dumpsys deviceidle force-idle. 6. Verificați întotdeauna finalizarea sarcinii prin înregistrare și analize. 7. Amintiți-vă limitele: iOS oferă ~30 de secunde pentru Background Fetch și ~câteva minute pentru BGProcessingTask. Android WorkManager nu garantează un timp exact de execuție.
Întrebări frecvente
Background Service rulează fără o notificare vizibilă și poate fi ucis de sistem în orice moment. Foreground Service trebuie să afișeze o notificare persistentă (ongoing notification) și are prioritate mai mare. Foreground Service este folosit pentru redarea muzicii și urmărirea GPS.
Doze Mode este un mod de economisire a energiei Android care dezactivează accesul la rețea și amână JobScheduler/WakeLock atunci când dispozitivul nu este utilizat. WorkManager se adaptează la Doze Mode automat.
Pe iOS, sarcinile în fundal se execută prin Background Fetch (actualizări periodice), BGTaskScheduler (sarcini amânate) sau Background Modes (audio, VoIP, BLE, locație). BGTaskScheduler este API-ul modern pentru iOS 13+, care înlocuiește Background Fetch.
WorkManager este soluția recomandată de Google pentru toate sarcinile în fundal pe Android. JobScheduler este un API mai vechi cu capacități limitate. WorkManager suportă lanțuri de sarcini, LiveData/Flow observabile și compatibilitate inversă până la API 14.
App Standby este un mod Android în care aplicațiile neutilizate sunt puse în stare de așteptare: cererile de rețea sunt amânate, sincronizarea este întreruptă. Dacă o aplicație nu este utilizată de câteva zile, Android o plasează într-un Standby Bucket (active, working, frequent, rare).
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.