Een service is een component in Android dat werk kan uitvoeren zonder een eigen gebruikersinterface te hebben, zoals het afspelen van muziek, het synchroniseren van gegevens of een lopende bestandsoverdracht. Samen met activities, broadcast receivers en content providers zijn services een van de vier fundamentele app-componenten in Android, en net als de andere moeten ze worden geregistreerd in de AndroidManifest.xml van de app. Standaard draait een service op de main thread van de app, dus zwaar werk moet nog steeds naar een achtergrondthread worden verplaatst.
Android maakt onderscheid tussen started services, die een taak uitvoeren totdat ze worden gestopt, en bound services, waaraan andere componenten zich kunnen binden en waarmee ze kunnen communiceren. Een foreground service voert werk uit waarvan de gebruiker zich bewust is en moet een permanente melding tonen. Omdat achtergrondwerk invloed heeft op de batterijduur en de prestaties, heeft Android geleidelijk beperkingen ingevoerd voor wanneer apps services op de achtergrond mogen starten, en voor uitstelbaar werk raadt Google doorgaans in plaats daarvan WorkManager aan.
Een service in Android is een app-component dat werk uitvoert zonder eigen gebruikersinterface, zoals het afspelen van muziek, synchronisatie of bestandsoverdrachten. Een service kan worden gestart om een taak uit te voeren of worden gebonden door andere componenten die ermee willen communiceren. Foreground services tonen een permanente melding, zodat de gebruiker weet dat het werk plaatsvindt, en vanwege de beperkingen die Android aan achtergrondwerk stelt, wordt voor uitstelbare taken vaak WorkManager gebruikt.
Meer over Service
Een service is een van de vier fundamentele componenten van een Android-app, samen met activities, broadcast receivers en content providers. Terwijl een activity een scherm toont waarmee de gebruiker interageert, wordt een service gebruikt voor werk dat geen gebruikersinterface vereist of dat moet doorgaan, zelfs als de gebruiker het scherm verlaat. Typische voorbeelden zijn het afspelen van muziek of podcasts, navigatie, het uploaden van bestanden en het synchroniseren van gegevens met een server.
Technisch gezien is een service een klasse die erft van android.app.Service en wordt geregistreerd met een service-element in AndroidManifest.xml. Het systeem bestuurt de levenscyclus van de service via methoden zoals onCreate(), onStartCommand(), onBind() en onDestroy(). Het is belangrijk te weten dat een service niet automatisch op een aparte thread draait. Standaard wordt de code ervan uitgevoerd op de main thread van de app, dus langdurig of blokkerend werk moet naar een achtergrondthread worden verplaatst, bijvoorbeeld met Kotlin-coroutines, om te voorkomen dat de app niet meer reageert.
Services kunnen op verschillende manieren worden gebruikt, die elk bij verschillende behoeften passen:
Foreground service: Voert werk uit waarvan de gebruiker zich bewust is, zoals het afspelen van muziek of het actief bijhouden van een training. Een foreground service moet een permanente melding tonen, en in nieuwere Android-versies moet de app een servicetype declareren en over de bijbehorende permissies beschikken.
Background service: Voert werk uit dat de gebruiker niet direct ziet. Sinds Android 8.0 gelden er strenge beperkingen voor wanneer apps zulke services mogen starten terwijl ze zelf op de achtergrond staan.
Bound service: Biedt een client-serverinterface waarin andere componenten, ook die in andere apps, zich aan de service kunnen binden, verzoeken kunnen versturen en antwoorden kunnen ontvangen. Een bound service blijft bestaan zolang er ten minste één component aan gebonden is.
Een van de grootste sterke punten van services is dat ze een app belangrijk werk laten voortzetten zonder dat dat aan een bepaald scherm gebonden is. Tegelijkertijd vereisen ze zorgvuldigheid, omdat werk op de achtergrond batterij, geheugen en data verbruikt. Android heeft daarom geleidelijk regels ingevoerd die achtergrondwerk beperken, en gebruikers kunnen apps die foreground services uitvoeren zien en stoppen.
Voor veel taken raadt Google in plaats daarvan WorkManager aan, dat deel uitmaakt van Android Jetpack. WorkManager is bedoeld voor werk dat betrouwbaar moet worden uitgevoerd, zelfs als de app wordt gesloten of het apparaat opnieuw wordt opgestart, en dat kan worden uitgesteld, zoals het uploaden van logbestanden of periodieke synchronisatie. WorkManager houdt rekening met de beperkingen van het systeem en kan worden geconfigureerd met voorwaarden zoals een netwerkverbinding of opladen.
Samengevat is een service de juiste keuze wanneer een app doorlopend werk moet uitvoeren waarvan de gebruiker verwacht dat het doorgaat, of wanneer andere componenten met een langlopend proces moeten communiceren. Door het juiste type service te kiezen, of WorkManager wanneer het werk kan worden uitgesteld, kunnen ontwikkelaars apps bouwen die zowel functioneel zijn als zuinig omgaan met de resources van het apparaat.
Veelgestelde vragen over Service
Wat is een service in Android?
Een service is een component in Android dat werk op de achtergrond uitvoert zonder een eigen gebruikersinterface te hebben. Het wordt gebruikt voor taken die moeten doorgaan, zelfs wanneer de gebruiker niet naar de app kijkt, zoals het afspelen van muziek, doorlopende navigatie of het uploaden van bestanden.
Een service moet worden gedeclareerd in het bestand AndroidManifest.xml. Het is belangrijk te weten dat een service standaard op de main thread van de app draait. Zware taken moeten daarom nog steeds naar een achtergrondthread of een coroutine worden verplaatst. In nieuwere Android-versies gelden bovendien strenge regels voor wanneer apps op de achtergrond mogen draaien, om batterij te besparen.
Welke typen services zijn er in Android?
Android maakt onderscheid tussen drie typen services. Een foreground service voert een taak uit waarvan de gebruiker zich bewust is, en moet een melding tonen zolang die draait. Die wordt bijvoorbeeld gebruikt voor het afspelen van muziek of het bijhouden van een hardloopsessie.
Een background service voert werk uit dat de gebruiker niet direct ziet. Sinds Android 8.0 gelden er strenge beperkingen voor wanneer apps zulke services mogen starten, en voor veel taken wordt in plaats daarvan WorkManager aanbevolen. Een bound service laat andere componenten, zoals een activity, zich eraan binden en ermee communiceren, en draait alleen zolang er iets aan gebonden is.
Wat is het verschil tussen een started service en een bound service?
Een started service wordt gestart met startService of startForegroundService en draait totdat die zichzelf stopt of wordt gestopt. Die voert doorgaans een specifieke taak uit en geeft geen resultaat rechtstreeks terug aan het component dat de service heeft gestart.
Een bound service wordt gestart wanneer een ander component zich eraan bindt met bindService. Die biedt een interface, zodat het component methoden kan aanroepen en antwoorden kan ontvangen, bijvoorbeeld een activity die een muziekspeler bestuurt. Wanneer er geen componenten meer aan gebonden zijn, wordt de service gestopt. Een service kan ook beide tegelijk zijn als die zowel gestart als gebonden is.
Wanneer moet WorkManager worden gebruikt in plaats van een service?
WorkManager is de door Google aanbevolen oplossing voor achtergrondwerk dat betrouwbaar moet worden uitgevoerd, zelfs als de app wordt gesloten of het apparaat opnieuw wordt opgestart. Dat kan het synchroniseren van gegevens zijn, het uploaden van logbestanden of periodiek opruimen.
WorkManager respecteert de regels van het systeem voor batterij en achtergrondactiviteit en kan zo worden ingesteld dat het alleen draait wanneer het apparaat bijvoorbeeld met wifi is verbonden of wordt opgeladen. Een service, vooral een foreground service, is relevanter wanneer het werk direct moet gebeuren en zichtbaar is voor de gebruiker, zoals het afspelen van muziek of een lopend gesprek. Voor kortstondig werk terwijl de app open is, zijn coroutines vaak voldoende.
Waarom moet een foreground service een melding tonen?
Een foreground service kan lang draaien en resources zoals de processor, de batterij en locatiegegevens gebruiken terwijl de gebruiker de app niet open heeft. Android vereist daarom dat die een permanente melding toont, zodat de gebruiker weet dat de app op de achtergrond bezig is.
Dat zorgt voor transparantie en laat de gebruiker de service stoppen of de app openen. In nieuwere Android-versies moeten ontwikkelaars ook een type voor de service declareren, zoals het afspelen van media, locatie of gegevenssynchronisatie, en over de bijbehorende permissies beschikken. Vanaf Android 13 moet de gebruiker ook toestemming geven voor meldingen, wat invloed heeft op hoe de melding wordt getoond.
Welke beperkingen legt Android op aan achtergrondwerk?
Om batterij te besparen en de privacy van de gebruiker te beschermen, heeft Android geleidelijk beperkingen voor achtergrondwerk ingevoerd. Sinds Android 8.0 mogen apps op de achtergrond doorgaans geen gewone background services starten, en het systeem stopt ze na korte tijd.
De Doze-modus en App Standby stellen netwerktoegang en jobs uit wanneer het apparaat niet in gebruik is of de app zelden wordt gebruikt. Nieuwere versies vereisen typen en permissies voor foreground services en beperken wanneer die vanaf de achtergrond mogen worden gestart. Toegang tot de locatie op de achtergrond vereist een afzonderlijke permissie. Achtergrondwerk moet daarom waar mogelijk worden ingepland met WorkManager.
Service voor dummies
Een service in een Android-app is een soort onzichtbare helper die kan blijven werken, zelfs wanneer niemand naar de app kijkt. Denk aan een muziek-app: een nummer kan worden gestart, de gebruiker kan teruggaan naar het startscherm en een bericht schrijven, en de muziek blijft spelen. Daar zorgt een service voor. Wanneer een app een service gebruikt voor iets waarvan de gebruiker moet weten, toont de telefoon een kleine melding, zodat duidelijk is dat de app bezig is. Tegelijkertijd zorgt Android ervoor dat apps op de achtergrond niet te veel stroom verbruiken, zodat de batterij langer meegaat.