Background Execution — mekanism för exekvering av mobilapplikationens kod när den inte är i förgrunden. Utan denna mekanism pausas applikationen av systemet vid minimering. Enligt Apple, 2026 begränsar iOS bakgrundstiden till 30 sekunder, medan Android möjliggör mer flexibla scenarier genom WorkManager och Foreground Service.
Huvudpunkter
Background Execution — applikationens förmåga att fortsätta exekvera kod efter att användaren har minimerat den eller växlat till en annan app. Utan särskilda mekanismer överför det mobila operativsystemet applikationen till tillståndet Suspended (pausad) inom några sekunder efter övergången till bakgrunden, vilket frigör processorn och minnet för aktiva appar.
En mobilapp går igenom flera livscykeltillstånd: Foreground (aktiv), Background (i bakgrunden), Suspended (pausad) och Terminated (avslutad). Background — det enda tillstånd där applikationen kan exekvera kod utan synligt gränssnitt. iOS och Android definierar varaktigheten och tillåtna operationer i detta tillstånd olika.
Bakgrundsexekvering är nödvändig för uppgifter som datasynkronisering, nedladdning av innehåll, bearbetning av Push-aviseringar, geolokalisering i bakgrunden och ljuduppspelning. Synkronisering — det vanligaste scenariot: applikationen skickar data till servern eller laddar ner uppdateringar utan användarens medverkan.
Begränsningarna för bakgrundsexekvering orsakas av tre faktorer: energiförbrukning, enhetsprestanda och användarens integritet. Processorn och radiomodulerna (Wi-Fi, mobildata) förbrukar mest energi — varje bakgrundsprocess förkortar batteritiden.
Googles forskning visar att appar som exekverar bakgrundsuppgifter var 5:e minut minskar enhetens drifttid med 20–30% per dag. Även optimerade bakgrundsoperationer med en frekvens på en gång i timmen har märkbar påverkan om det finns fler än två sådana appar.
Varje bakgrundsapp tar upp arbetsminne. Vid minnesbrist avlastar systemet appar från minnet, vilket leder till omstart när användaren återvänder. iOS använder Jetsam-algoritmen — en mekanism för tvångsavslutning av bakgrundsprocesser när minnesgränsen överskrids. Android använder LMK (Low Memory Killer) med liknande princip.
Från och med Android 10 och iOS 13 kräver systemet att applikationer deklarerar syftet med bakgrundsarbete. Android införde begränsning för att starta Broadcast Receiver i bakgrunden. iOS kräver att Background Mode anges i projektets Capabilities. Användaren kan inaktivera bakgrundsexekvering för vilken app som helst i inställningarna.
| OS | Version | Begränsning | Påverkan |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST förbjuden | 67% av bakgrunds-Broadcasts trasiga |
| Android | 9.0 | Doze förbättrat | Begränsning av nätverksanrop |
| Android | 12+ | Foreground Service begränsad | Förbud mot start från bakgrunden |
| iOS | 7+ | Background App Refresh | Periodiska uppdateringsfönster |
| iOS | 13+ | BGTaskScheduler | Planering istället för exekvering |
Android tillhandahåller flera mekanismer för bakgrundsexekvering, var och en löser sin egen kategori av uppgifter. WorkManager — det rekommenderade API:t för fördröjda och periodiska uppgifter. Foreground Service — för omedelbar exekvering med synlig avisering. JobScheduler — lågnivåmotsvarighet till WorkManager.
WorkManager — en del av Android Jetpack, säkerställer exekvering av bakgrundsuppgifter med garanti för slutförande även efter omstart av enheten. API:t väljer optimal exekveringstid med hänsyn till nätverksstatus, batterinivå och Doze-läge. WorkManager är kompatibelt med API 14+ och ersätter föråldrade AlarmManager och JobScheduler.
När applikationen behöver utföra en uppgift som är synlig för användaren (musikuppspelning, geolokaliseringsinspelning), används Foreground Service. Tjänsten visar en permanent avisering i statusfältet och har högre prioritet — systemet avslutar den inte förrän uppgiften är klar. Från Android 13 krävs tillståndet POST_NOTIFICATIONS.
Från Android 6.0 går enheten in i Doze-läge vid inaktivitet. I detta läge skjuts nätverksoperationer, synkronisering och JobScheduler upp. WorkManager anpassar sig automatiskt till Doze — uppgifter utförs i närmaste Maintenance Window när enheten vaknar ur sömn för underhåll.
iOS använder en striktare metod för bakgrundsexekvering. Background App Refresh — den huvudsakliga mekanismen för periodisk datauppdatering. BGTaskScheduler — API för planering av uppgifter med hänsyn till systemstatus. För långvariga operationer finns Background Modes: audio, location, voip, fetch och processing.
Background App Refresh tillåter applikationen att vakna var 15–30:e minut för datasynkronisering. Vakningstiden beror på användarens beteende — systemet analyserar hur ofta hen öppnar appen. Användaren kan inaktivera denna funktion för enskilda appar i Settings — General — Background App Refresh.
Från iOS 13 har BGTaskScheduler ersatt föråldrade performFetch och beginBackgroundTask. Applikationen registrerar uppgifter med identifierare och minimiintervall, och systemet bestämmer själv optimal exekveringstid. Uppgifterna delas in i två typer: BGProcessingTask (långvariga, 10+ minuter) och BGAppRefreshTask (korta, upp till 30 sekunder).
iOS tilldelar applikationen begränsad tid för att utföra en bakgrundsuppgift — upp till 30 sekunder för BGAppRefreshTask och upp till 10 minuter för BGProcessingTask. Efter att gränsen överskridits avslutar systemet tvångsmässigt uppgiften. Utvecklaren måste anropa en utgångshanterare (expiration handler) för att spara temporära resultat.
Låt oss titta på praktisk implementering av bakgrundsexekvering på Android med WorkManager. Exempel på datasynkronisering var 8:e timme med hänsyn till nätverksstatus. WorkManager garanterar exekvering av uppgiften även efter omstart av enheten.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "Data synkroniserad")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Starta periodisk uppgift var 8:e timme
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)
För långvariga operationer synliga för användaren, använd Foreground Service. Exempel på filnedladdning med förlopp i aviseringen. Tjänsten anropar startForeground() med en avisering som inte kan avfärdas. Vid slutförd nedladdning — 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("Ladda ner fil")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
På iOS konfigureras bakgrundsexekvering via BGTaskScheduler. Exempel på registrering och exekvering av innehållsuppdateringsuppgift. Applikationen måste registrera uppgiftsidentifieraren i Info.plist och anropa submit när uppgiften ska schemaläggas.
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 = {
// Spara temporära data
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
För långvariga operationer (rensning av cache, databearbetning) använd BGProcessingTask. Systemet ger upp till 10 minuter för exekvering. Startas endast när enheten är på laddning och ansluten till Wi-Fi. Kräver separat identifierare i Info.plist och registrering via 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 och iOS skiljer sig radikalt i filosofin kring bakgrundsexekvering. Android erbjuder flexibla verktyg med stor kontroll, men kräver att utvecklaren väljer rätt API. iOS begränsar möjligheterna men garanterar stabil prestanda och autonomi för användaren.
| Kriterium | Android | iOS |
|---|---|---|
| Rekommenderat API | WorkManager | BGTaskScheduler |
| Max. uppgiftstid | Obegränsad (Foreground Service) | 30 s / 10 min (processing) |
| Periodiska uppgifter | Ja, via PeriodicWorkRequest | Ja, via BGAppRefreshTask |
| Exekveringsgaranti | Ja, även efter omstart | Nej — systemet bestämmer när |
| Nätverksåtkomst i bakgrunden | Begränsad av Doze-läge | Via URLSession med bakgrundskonfig |
| Geolokalisering i bakgrunden | Foreground Service + tillstånd | Background Mode location + NSLocation |
| Ljud i bakgrunden | Foreground Service med mediaavisering | Background Mode audio + AVAudioSession |
WorkManager är optimalt för uppgifter som måste utföras oavsett applikationens status: datasynkronisering, analyssändning, köbearbetning. API:t garanterar exekvering även efter att enheten stängts av — uppgiften omplaneras efter start.
BGTaskScheduler är lämpligt för uppgifter som systemet kan utföra när som helst: nedladdning av nytt innehåll, uppdatering av widgetar, rensning av cache. Inte lämpligt för brådskande operationer — systemet skjuter upp uppgiften om enheten är i Doze eller batteriet är lågt.
Vanliga frågor
Background Execution — ett allmänt begrepp som beskriver all kod som exekveras i bakgrunden. Background Modes — en specifik iOS-mekanism som tillåter applikationen att utföra vissa typer av bakgrundsoperationer: audio, geolocation, VoIP, fetch. Android använder en liknande metod via typer av Foreground Service.
På iOS är detta standardgränsen för BGAppRefreshTask. Systemet tvångsavslutar uppgiften efter att gränsen överskridits. På Android uppstår en liknande situation när applikationen inte använder WorkManager eller Foreground Service — en vanlig Service avslutas av systemet efter övergång till bakgrunden.
På Android använder du WorkManager — garanterar exekvering även efter omstart. På iOS kan exekvering inte garanteras — systemet bestämmer själv när det startar uppgiften. Det enda sättet att garantera — användning av Background Modes (audio, location) med synlig indikator för användaren.
På iOS anropar du UIApplication.shared.backgroundRefreshStatus — status .available, .denied eller .restricted. På Android använder du PowerManager.isIgnoringBatteryOptimizations() för att kontrollera undantag från batterioptimering. För WorkManager krävs ingen kontroll — API:t hanterar systembegränsningarna själv.
Push-aviseringar — den huvudsakliga mekanismen för att utlösa åtgärder utan bakgrundskod. På iOS finns PushKit för VoIP och Silent Push för datauppdatering. På Android — High Priority FCM och Notification Trampoline. WebSockets via Foreground Service — ett alternativ för realtidsappar.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också