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 (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.
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.
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.
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 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.
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 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 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 — 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.
| Parameter | Started | Bound | Foreground |
|---|---|---|---|
| Start | startService | bindService | startForeground |
| Leven | tot stopSelf | zolang er clients zijn | tot stopForeground |
| Melding | nee | nee | verplicht |
| Gedood | ja | ja | nee |
| Voorbeeld | downloaden | speler | muziek |
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.
// 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.
// 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)
}
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 — 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.
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)
}
}
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.
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.
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
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.
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.
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.
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.
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
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