Background Execution — mechanisme voor het uitvoeren van code van een mobiele app wanneer deze niet op de voorgrond staat. Zonder dit mechanisme wordt de app door het systeem gepauzeerd bij het minimaliseren. Volgens Apple, 2026 beperkt iOS de achtergrondtijd tot 30 seconden, terwijl Android flexibelere scenario's mogelijk maakt via WorkManager en Foreground Service.
Belangrijkste
Background Execution — het vermogen van een app om code te blijven uitvoeren nadat de gebruiker deze heeft geminimaliseerd of naar een andere app is overgeschakeld. Zonder speciale mechanismen brengt het mobiele besturingssysteem de app binnen enkele seconden in de status Suspended (onderbroken), waarbij de processor en het geheugen worden vrijgemaakt voor actieve apps.
Een mobiele app doorloopt verschillende levenscyclusstatussen: Foreground (actief), Background (op achtergrond), Suspended (onderbroken) en Terminated (beëindigd). Background — de enige status waarin de app code kan uitvoeren zonder zichtbare interface. iOS en Android definiëren de duur en toegestane bewerkingen in deze status verschillend.
Achtergronduitvoering is nodig voor taken zoals gegevenssynchronisatie, het downloaden van content, het verwerken van Push-meldingen, geolocatie op de achtergrond en het afspelen van audio. Synchronisatie — het meest voorkomende scenario: de app stuurt gegevens naar de server of downloadt updates zonder tussenkomst van de gebruiker.
Beperkingen van achtergronduitvoering worden veroorzaakt door drie factoren: energieverbruik, apparaatprestaties en gebruikersprivacy. De processor en radiomodules (Wi-Fi, mobiele data) verbruiken de meeste energie — elk achtergrondproces verkort de batterijduur.
Google-onderzoek toont aan dat apps die elke 5 minuten achtergrondtaken uitvoeren, de batterijduur met 20–30% per dag verkorten. Zelfs geoptimaliseerde achtergrondbewerkingen met een frequentie van eens per uur hebben een merkbare impact als er meer dan twee van dergelijke apps zijn.
Elke achtergrond-app neemt werkgeheugen in beslag. Bij geheugentekort verwijdert het systeem apps uit het geheugen, wat leidt tot herstarten bij terugkeer van de gebruiker. iOS gebruikt het Jetsam-algoritme — een mechanisme voor het geforceerd beëindigen van achtergrondprocessen bij overschrijding van de geheugenlimiet. Android gebruikt LMK (Low Memory Killer) met een vergelijkbaar principe.
Vanaf Android 10 en iOS 13 vereist het systeem dat apps het doel van achtergrondwerk declareren. Android heeft het starten van Broadcast Receiver op de achtergrond beperkt. iOS vereist dat Background Mode wordt opgegeven in de Capabilities van het project. De gebruiker kan achtergronduitvoering voor elke app uitschakelen in de instellingen.
| OS | Versie | Beperking | Impact |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST verboden | 67% achtergrond-Broadcasts kapot |
| Android | 9.0 | Doze verbeterd | Beperking netwerkoproepen |
| Android | 12+ | Foreground Service beperkt | Verbod op starten vanuit achtergrond |
| iOS | 7+ | Background App Refresh | Periodieke updatevensters |
| iOS | 13+ | BGTaskScheduler | Planning in plaats van uitvoering |
Android biedt verschillende mechanismen voor achtergronduitvoering, elk voor een eigen categorie taken. WorkManager — de aanbevolen API voor uitgestelde en periodieke taken. Foreground Service — voor onmiddellijke uitvoering met een zichtbare melding. JobScheduler — een low-level alternatief voor WorkManager.
WorkManager — onderdeel van Android Jetpack, zorgt voor uitvoering van achtergrondtaken met de garantie dat ze worden voltooid, zelfs na een herstart van het apparaat. De API kiest de optimale uitvoeringstijd op basis van netwerkstatus, batterijniveau en Doze-modus. WorkManager is compatibel met API 14+ en vervangt verouderde AlarmManager en JobScheduler.
Wanneer de app een voor de gebruiker zichtbare taak moet uitvoeren (muziek afspelen, geolocatie vastleggen), wordt Foreground Service gebruikt. De service toont een permanente melding in de statusbalk en heeft een hogere prioriteit — het systeem beëindigt deze pas na voltooiing van de taak. Vanaf Android 13 is POST_NOTIFICATIONS-toestemming vereist.
Vanaf Android 6.0 gaat het apparaat bij inactiviteit in de Doze-modus. In deze modus worden netwerkbewerkingen, synchronisatie en JobScheduler uitgesteld. WorkManager past zich automatisch aan Doze aan — taken worden uitgevoerd in het dichtstbijzijnde Maintenance Window, wanneer het apparaat uit de slaapstand komt voor onderhoud.
iOS hanteert een strengere aanpak voor achtergronduitvoering. Background App Refresh — het belangrijkste mechanisme voor periodieke gegevensupdates. BGTaskScheduler — API voor het plannen van taken op basis van de systeemstatus. Voor langdurige bewerkingen zijn Background Modes beschikbaar: audio, location, voip, fetch en processing.
Background App Refresh stelt de app in staat om elke 15–30 minuten te ontwaken voor gegevenssynchronisatie. De wektijd hangt af van het gedrag van de gebruiker — het systeem analyseert hoe vaak hij de app opent. De gebruiker kan deze functie voor individuele apps uitschakelen via Settings — General — Background App Refresh.
Vanaf iOS 13 heeft BGTaskScheduler de verouderde performFetch en beginBackgroundTask vervangen. De app registreert taken met een identifier en minimuminterval, en het systeem bepaalt zelf de optimale uitvoeringstijd. Taken worden verdeeld in twee typen: BGProcessingTask (langdurig, 10+ minuten) en BGAppRefreshTask (kort, tot 30 seconden).
iOS kent de app beperkte tijd toe voor het uitvoeren van een achtergrondtaak — tot 30 seconden voor BGAppRefreshTask en tot 10 minuten voor BGProcessingTask. Na het verstrijken van de limiet beëindigt het systeem de taak geforceerd. De ontwikkelaar moet een expiration handler aanroepen om tussentijdse resultaten op te slaan.
Laten we de praktische implementatie van achtergronduitvoering op Android bekijken met WorkManager. Voorbeeld van gegevenssynchronisatie elke 8 uur met inachtneming van de netwerkstatus. WorkManager garandeert uitvoering van de taak, zelfs na een herstart van het apparaat.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "Gegevens gesynchroniseerd")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Periodieke taak starten elke 8 uur
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)
Voor langdurige, voor de gebruiker zichtbare bewerkingen gebruik je Foreground Service. Voorbeeld van het downloaden van een bestand met voortgang in de melding. De service roept startForeground() aan met een melding die niet kan worden genegeerd. Bij voltooiing van de download — 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("Bestand downloaden")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
Op iOS wordt achtergronduitvoering geconfigureerd via BGTaskScheduler. Voorbeeld van het registreren en uitvoeren van een content-updatetaak. De app moet de taakidentifier in Info.plist registreren en submit aanroepen op het moment dat de taak moet worden gepland.
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 = {
// Tussentijdse gegevens opslaan
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
Voor langdurige bewerkingen (cache opschonen, gegevensverwerking) gebruik je BGProcessingTask. Het systeem geeft tot 10 minuten voor uitvoering. Wordt alleen gestart wanneer het apparaat aan de lader ligt en met Wi-Fi is verbonden. Vereist een aparte identifier in Info.plist en registratie 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 en iOS verschillen fundamenteel in de filosofie van achtergronduitvoering. Android biedt flexibele tools met veel controle, maar vereist van de ontwikkelaar de juiste API-keuze. iOS beperkt de mogelijkheden, maar garandeert stabiele prestaties en autonomie voor de gebruiker.
| Criterium | Android | iOS |
|---|---|---|
| Aanbevolen API | WorkManager | BGTaskScheduler |
| Max. taaktijd | Ongelimiteerd (Foreground Service) | 30 s / 10 min (processing) |
| Periodieke taken | Ja, via PeriodicWorkRequest | Ja, via BGAppRefreshTask |
| Uitvoeringsgarantie | Ja, zelfs na herstart | Nee — systeem beslist wanneer |
| Netwerktoegang op achtergrond | Beperkt door Doze-modus | Via URLSession met background config |
| Geolocatie op achtergrond | Foreground Service + toestemming | Background Mode location + NSLocation |
| Audio op achtergrond | Foreground Service met mediamelding | Background Mode audio + AVAudioSession |
WorkManager is optimaal voor taken die onafhankelijk van de app-status moeten worden uitgevoerd: gegevenssynchronisatie, het verzenden van analytics, het verwerken van wachtrijen. De API garandeert uitvoering, zelfs na uitschakeling van het apparaat — de taak wordt opnieuw gepland na het opstarten.
BGTaskScheduler is geschikt voor taken die het systeem op elk gewenst moment kan uitvoeren: het downloaden van nieuwe content, het updaten van widgets, het opschonen van de cache. Niet geschikt voor urgente bewerkingen — het systeem stelt de taak uit als het apparaat in Doze is of de batterij bijna leeg is.
Veelgestelde vragen
Background Execution — een algemeen begrip dat alle code beschrijft die op de achtergrond wordt uitgevoerd. Background Modes — een specifiek iOS-mechanisme waarmee de app bepaalde typen achtergrondbewerkingen kan uitvoeren: audio, geolocatie, VoIP, fetch. Android gebruikt een vergelijkbare benadering via typen Foreground Service.
Op iOS is dit de standaardlimiet voor BGAppRefreshTask. Het systeem beëindigt de taak geforceerd na het verstrijken van de limiet. Op Android treedt een vergelijkbare situatie op wanneer de app geen WorkManager of Foreground Service gebruikt — een gewone Service wordt door het systeem beëindigd na het naar de achtergrond gaan.
Op Android gebruik je WorkManager — het garandeert uitvoering, zelfs na een herstart. Op iOS kan uitvoering niet worden gegarandeerd — het systeem beslist zelf wanneer het de taak start. De enige manier om het te garanderen is het gebruik van Background Modes (audio, location) met een zichtbare indicator voor de gebruiker.
Op iOS roep je UIApplication.shared.backgroundRefreshStatus aan — status .available, .denied of .restricted. Op Android gebruik je PowerManager.isIgnoringBatteryOptimizations() om de uitzondering op batterijoptimalisatie te controleren. Voor WorkManager is controle niet nodig — de API handelt de systeembeperkingen zelf af.
Push-meldingen — het belangrijkste mechanisme voor het triggeren van acties zonder achtergrondcode. Op iOS zijn PushKit voor VoIP en Silent Push voor gegevensupdates beschikbaar. Op Android — High Priority FCM en Notification Trampoline. WebSockets via Foreground Service — een alternatief voor real-time apps.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook