Background Service — wat is het, typen en hoe werkt het in Android

Auteur: IT Sectr Gepubliceerd: 2026-03-27 Leestijd: 8 min

Background Service — is een Android-component voor het uitvoeren van langdurige bewerkingen op de achtergrond zonder gebruikersinterface. In tegenstelling tot Activity blijft Service werken, zelfs nadat de applicatie is geminimaliseerd of de gebruiker naar een andere app is overgeschakeld. Volgens Android Developers, 2026 zijn er drie soorten services: Started Service, Bound Service en Foreground Service, elk met een eigen levenscyclus en toepassingsgebied.

Belangrijkste

  • Background Service — is een Android-component voor achtergrondbewerkingen zonder UI, onafhankelijk van activiteit.
  • Started Service wordt gestart via startService en werkt tot expliciete stop via stopSelf.
  • Bound Service wordt via bindService aan een component gebonden en leeft zolang er verbonden clients zijn.
  • Foreground Service toont een permanente melding en wordt niet door het systeem gedood bij een lage batterij.
  • Vanaf versie Android 8 hebben achtergrondservices strikte beperkingen voor opstarten op de achtergrond.

Wat is Background Service in Android?

Background Service (of gewoon Service) — een van de vier hoofdcomponenten van een Android-applicatie, naast Activity, BroadcastReceiver en ContentProvider. In tegenstelling tot Activity heeft Service geen visuele interface en is bedoeld voor bewerkingen die moeten doorgaan, ongeacht of de app op de voorgrond staat of niet.

Service draait in de hoofdthread (main thread) van de applicatie, dus elke blokkerende bewerking binnenin vereist het maken van een aparte thread. Als dit niet gebeurt, roept het systeem ANR (Application Not Responding) op. Voor eenvoudige achtergrondbewerkingen biedt Android IntentService, die automatisch een werkthread maakt. In moderne projecten wordt aanbevolen om Kotlin-coroutines met CoroutineScope binnen Service te gebruiken voor asynchrone verwerking zonder de hoofdthread te blokkeren.

Het belangrijkste doel van Service — muziek afspelen, bestanden downloaden, werken met netwerkverzoeken, gegevens synchroniseren en andere taken die moeten doorgaan nadat de gebruiker de app verlaat. Met de komst van Android 8 moeten ontwikkelaars echter bewust kiezen tussen servicetypen, rekening houdend met de beperkingen van achtergrondwerk.

Hoe werkt de levenscyclus van Service?

Service heeft een eigen levenscyclus die verschilt van Activity. Het omvat vier belangrijke methoden: onCreate, onStartCommand, onBind en onDestroy. Inzicht in deze cyclus is noodzakelijk voor een correcte implementatie van achtergrondtaken zonder geheugenlekken.

onCreate en onStartCommand

De methode onCreate wordt aangeroepen bij het maken van de service, eenmalig tijdens zijn levensduur. Hierin worden resources geïnitialiseerd: timers, databaseverbindingen, sockets. De methode onStartCommand wordt elke keer aangeroepen bij startService, wat het mogelijk maakt om opdrachten naar een al draaiende service te sturen. De retourwaarde bepaalt het gedrag van het systeem bij herstart.

kotlin
class DownloadService : Service() {

    override fun onCreate() {
        super.onCreate()
        initializeDownloader()
    }

    override fun onStartCommand(
        intent: Intent?,
        flags: Int,
        startId: Int
    ): Int {
        downloadFile(intent?.getStringExtra("url"))
        return START_STICKY
    }

    override fun onBind(intent: Intent): IBinder? = null
}

onBind en onDestroy

onBind wordt aangeroepen bij het binden van de service via bindService en retourneert een IBinder-object voor interactie met de client. Deze methode wordt alleen gebruikt voor Bound Service. onDestroy — de laatste aanroep voor de vernietiging van de service. Hierin worden alle resources vrijgemaakt, threads gestopt en taken geannuleerd.

Soorten achtergrondservices

Android biedt drie soorten Service, elk bedoeld voor zijn eigen scenario. Het verkeerde type kiezen kan leiden tot instabiele werking van de app of een hoog batterijverbruik.

Started Service

Started Service wordt gestart door startService aan te roepen en werkt tot stopSelf of stopService wordt aangeroepen. Het is geschikt voor taken die onmiddellijk moeten worden uitgevoerd: het verzenden van analytics, beeldverwerking, het downloaden van een enkel bestand. Na voltooiing stopt de service zichzelf.

Bound Service

Bound Service biedt een client-serverinterface, waarmee Activity, Fragment of een andere component met de service kan communiceren. De service leeft zolang er ten minste één verbonden client is. Wanneer alle clients loskoppelen, wordt de service vernietigd. Bound Service is handig voor taken die tweerichtingscommunicatie vereisen: muziekspeler, navigatie.

Foreground Service

Foreground Service — is een Started Service met een permanente melding in de statusbalk. Het systeem beschouwt zo’n service als actief en doodt deze niet, zelfs niet bij gebrek aan geheugen. Foreground Service is verplicht voor het afspelen van muziek, audio-opname, locatiebepaling en andere taken die belangrijk zijn voor de gebruiker.

ParameterStartedBoundForeground
StartstartServicebindServicestartForeground
Leventot stopSelfzolang er clients zijntot stopForeground
Meldingneeneeverplicht
Gedoodjajanee
Voorbeelddownloadenspelermuziek

Service maken en starten

Maken van de service begint met het declareren van een klasse die overerft van Service en deze registreren in AndroidManifest.xml. Zonder registratie in het manifest kan het systeem de service niet starten en leidt elke aanroep van startService tot een uitzondering.

kotlin
// Registratie in AndroidManifest.xml
@SuppressLint("ForegroundServiceType")
class SyncService : Service() {

    override fun onStartCommand(
        intent: Intent?,
        flags: Int,
        startId: Int
    ): Int {
        startForeground(
            NOTIFICATION_ID,
            createNotification()
        )
        performSync(intent)
        return START_NOT_STICKY
    }
}

Om de service te starten vanuit Activity of Fragment wordt Intent gebruikt met een expliciete vermelding van de serviceklasse. Vanaf Android 8 is voor Foreground Service de machtiging FOREGROUND_SERVICE in het manifest vereist.

kotlin
// Started Service starten
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)

// Foreground Service starten (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(intent)
} else {
    startService(intent)
}

Beperkingen in Android 8+

Vanaf Android 8 (API 26) heeft Google strikte beperkingen ingevoerd voor achtergrondservices. Het starten van een Service op de achtergrond (wanneer de app niet op de voorgrond is) is alleen toegestaan in uitzonderlijke gevallen: bij het ontvangen van een pushmelding, na het opstarten van het apparaat of via JobScheduler.

Voor langdurige taken die geen onmiddellijke uitvoering vereisen, wordt aanbevolen om WorkManager of JobScheduler te gebruiken. Als de app echt een werkende service nodig heeft, is de enige manier een Foreground Service met een melding die de gebruiker ziet. Het starten van een service op de achtergrond zonder melding wordt door het systeem genegeerd.

JobIntentService voor achterwaartse compatibiliteit

JobIntentService — is een gespecialiseerde klasse die verscheen in de support library voor werk op Android 5+. Het combineert het gedrag van IntentService (automatische werkthread, sequentiële verwerking) met planning via JobScheduler. Op Android 8+ gebruikt JobIntentService onder de motorkap JobScheduler, en op oudere versies de gewone Service. Dit maakt een uniforme verwerking van achtergrondtaken mogelijk zonder extra versiecontroles van Android.

kotlin
class UploadJobService : JobIntentService() {

    companion object {
        private const val JOB_ID = 1000

        fun enqueueWork(context: Context, work: Intent) {
            enqueueWork(
                context,
                UploadJobService::class.java,
                JOB_ID,
                work
            )
        }
    }

    override fun onHandleWork(intent: Intent) {
        val fileUri = intent.getStringExtra("file_uri")
        // Uitgevoerd in achtergrondthread
        uploadFile(fileUri)
    }
}

Geheugenbeheer en lekken in Service

Een van de veelvoorkomende problemen bij het werken met Background Service zijn geheugenlekken. Omdat Service langer kan leven dan Activity, leiden verwijzingen naar Activity binnen Service (via listener, callback of broadcast) tot het onvermogen van de garbage collector om UI-componenten op te ruimen. Het wordt aanbevolen om WeakReference, ViewModel of LiveData te gebruiken voor de communicatie tussen Service en UI. In onDestroy moeten alle abonnementen worden geannuleerd, threads worden gestopt en cursors worden gesloten.

Service vs WorkManager: wat te kiezen

De keuze tussen Background Service en WorkManager hangt af van het scenario. Service is geschikt voor taken die onmiddellijk en continu moeten worden uitgevoerd: muziek afspelen, audio opnemen, GPS volgen. WorkManager is beter voor uitgestelde, gegarandeerde taken: synchronisatie, analytics verzenden, logs uploaden. WorkManager overleeft een herstart van het apparaat, Service niet. Service kan Foreground zijn met een melding, terwijl WorkManager stil op de achtergrond werkt. In de praktijk combineren ontwikkelaars beide benaderingen: Foreground Service voor kritieke gebruikerstaken en WorkManager voor achtergrondonderhoud.

Android 12 introduceerde een vlag android:foregroundServiceType die het specificeren van het servicetype vereist: dataSync, camera, connectedDevice, location, mediaPlayback en andere. Een onjuiste type-aanduiding leidt tot een uitzondering bij het starten. Deze praktijk maakt Background Service transparanter voor de gebruiker en het systeem.

Voorbeeld van Service-registratie in AndroidManifest

Een correcte registratie van Service in het manifest omvat de attributen exported (toegankelijkheid voor externe apps), foregroundServiceType (type achtergrondservice op Android 12+) en permission. Voor Bound Service moet ook android:permission="android.permission.BIND_JOB_SERVICE" worden gedeclareerd voor JobIntentService. Zonder registratie in het manifest eindigt elke aanroep van startService of bindService met een uitzondering, daarom is manifestcontrole de eerste stap bij het diagnosticeren van problemen met Service.

Veelgestelde vragen

In welke thread draait Service standaard?

Service draait in de hoofdthread (UI Thread) van de applicatie. Elke blokkerende bewerking binnen onStartCommand of onHandleIntent moet naar een aparte thread of coroutine worden verplaatst, anders roept het systeem na 5 seconden ANR op.

Wat is het verschil tussen IntentService en gewone Service?

IntentService — is een subklasse van Service die automatisch een werkthread maakt en opdrachten sequentieel verwerkt. Na voltooiing van de laatste taak stopt IntentService zichzelf. Vanaf Android 8 wordt IntentService als verouderd beschouwd ten gunste van JobIntentService of WorkManager.

Kan ik een Service starten wanneer de app op de achtergrond is op Android 12?

Het starten van Started Service vanuit de achtergrond op Android 12 is verboden. Uitzondering — Foreground Service met gedeclareerde foregroundServiceType in het manifest en een geldige melding. Ook is een korte start toegestaan na ontvangst van een FCM-bericht met hoge prioriteit.

Hoe gegevens van Service naar Activity sturen?

Er zijn drie manieren: BroadcastReceiver met lokale broadcast, het Messenger-mechanisme via Handler, en LiveData/Flow in MVVM-architectuur met gedeelde ViewModel. Voor Bound Service wordt IBinder gebruikt met directe aanroep van methoden.

Wat gebeurt er bij herstart van de app als Service actief was?

Als Service is gestart met de vlag START_STICKY, herstart het systeem deze na vernietiging van het proces door geheugengebrek. De vlag START_NOT_STICKY betekent dat het systeem de service niet zal herstarten. START_REDELIVER_INTENT is vergelijkbaar met START_STICKY, maar geeft de laatste Intent door.

Samenvatting

  • Background Service — is een Android-component voor achtergrondbewerkingen zonder interface, werkend in de hoofdthread.
  • Drie typen — Started, Bound en Foreground — dekken verschillende scenario’s: van een eenmalige taak tot continu werk met melding.
  • Levenscyclus omvat onCreate, onStartCommand, onBind en onDestroy — het is belangrijk om resources vrij te geven in onDestroy.
  • Foreground Service — het enige type dat stabiel werkt op Android 8+ zonder risico te worden gedood door het systeem.
  • WorkManager en JobScheduler hebben de voorkeur voor uitgestelde en gegarandeerde achtergrondtaken.
  • Gebruik Service niet voor taken die een exacte uitvoeringstijd vereisen — daar is AlarmManager voor.
  • Registreer altijd Service in AndroidManifest.xml en geef android:foregroundServiceType op op Android 12+.

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.

Bespreek het project

Lees ook