En service är en komponent i Android som kan utföra arbete utan ett eget användargränssnitt, till exempel spela musik, synkronisera data eller genomföra en pågående filöverföring. Tillsammans med activities, broadcast receivers och content providers är services en av de fyra grundläggande appkomponenterna i Android, och precis som de andra måste de registreras i appens AndroidManifest.xml. Som standard körs en service på appens huvudtråd, så tungt arbete måste ändå flyttas till en bakgrundstråd.
Android skiljer mellan startade services, som utför en uppgift tills de stoppas, och bundna services, som andra komponenter kan binda sig till och kommunicera med. En foreground service utför arbete som användaren är medveten om och måste visa en beständig avisering. Eftersom bakgrundsarbete påverkar batteritid och prestanda har Android successivt infört begränsningar för när appar får starta services i bakgrunden, och för uppskjutbart arbete rekommenderar Google vanligtvis WorkManager i stället.
En service i Android är en appkomponent som utför arbete utan eget användargränssnitt, till exempel musikuppspelning, synkronisering eller filöverföringar. Den kan startas för att utföra en uppgift eller bindas av andra komponenter som vill kommunicera med den. Foreground services visar en beständig avisering så att användaren vet att arbetet pågår, och på grund av Androids begränsningar för bakgrundsarbete används WorkManager ofta för uppskjutbara uppgifter.
Mer om Service
En service är en av de fyra grundläggande komponenterna i en Android-app, tillsammans med activities, broadcast receivers och content providers. Medan en activity visar en skärm som användaren interagerar med, används en service för arbete som inte kräver ett användargränssnitt eller som måste fortsätta även om användaren lämnar skärmen. Typiska exempel är att spela musik eller poddar, navigering, uppladdning av filer och synkronisering av data med en server.
Tekniskt är en service en klass som ärver från android.app.Service och registreras med ett service-element i AndroidManifest.xml. Systemet styr tjänstens livscykel genom metoder som onCreate(), onStartCommand(), onBind() och onDestroy(). Det är viktigt att veta att en service inte automatiskt körs i en separat tråd. Som standard körs dess kod på appens huvudtråd, så långvarigt eller blockerande arbete måste flyttas till en bakgrundstråd, till exempel med Kotlin coroutines, för att appen inte ska sluta svara.
Services kan användas på olika sätt, som vart och ett passar olika behov:
Foreground service: Utför arbete som användaren är medveten om, till exempel musikuppspelning eller aktiv träningsregistrering. En foreground service måste visa en beständig avisering, och i nyare Android-versioner måste appen deklarera en service-typ och ha tillhörande behörigheter.
Background service: Utför arbete som användaren inte ser direkt. Sedan Android 8.0 finns det strikta begränsningar för när appar får starta sådana services medan de själva är i bakgrunden.
Bound service: Erbjuder ett klient-server-gränssnitt där andra komponenter, även sådana i andra appar, kan binda sig till tjänsten, skicka förfrågningar och ta emot svar. En bunden service lever så länge minst en komponent är bunden till den.
En av de största styrkorna med services är att de gör det möjligt för en app att fortsätta viktigt arbete utan att vara bunden till en viss skärm. Samtidigt kräver de försiktighet, eftersom arbete i bakgrunden förbrukar batteri, minne och data. Android har därför successivt infört regler som begränsar bakgrundsarbete, och användare kan se och stoppa appar som kör foreground services.
För många uppgifter rekommenderar Google i stället WorkManager, som är en del av Android Jetpack. WorkManager är avsett för arbete som måste utföras tillförlitligt, även om appen stängs eller enheten startas om, och som kan skjutas upp, till exempel uppladdning av loggfiler eller periodisk synkronisering. WorkManager tar hänsyn till systemets begränsningar och kan konfigureras med villkor som nätverksanslutning eller laddning.
Sammanfattningsvis är en service rätt val när en app behöver utföra pågående arbete som användaren förväntar sig ska fortsätta, eller när andra komponenter behöver kommunicera med en långvarig process. Genom att välja rätt typ av service, eller WorkManager när arbetet kan skjutas upp, kan utvecklare bygga appar som är både funktionella och skonsamma mot enhetens resurser.
Vanliga frågor om Service
Vad är en service i Android?
En service är en komponent i Android som utför arbete i bakgrunden utan ett eget användargränssnitt. Den används för uppgifter som behöver fortsätta även när användaren inte tittar på appen, till exempel musikuppspelning, pågående navigering eller uppladdning av filer.
En service måste deklareras i filen AndroidManifest.xml. Det är viktigt att veta att en service som standard körs på appens huvudtråd. Tunga uppgifter måste därför ändå flyttas till en bakgrundstråd eller en coroutine. I nyare Android-versioner finns det också strikta regler för när appar får köras i bakgrunden, för att spara batteri.
Vilka typer av services finns det i Android?
Android skiljer mellan tre typer av services. En foreground service utför en uppgift som användaren är medveten om, och den måste visa en avisering så länge den körs. Den används till exempel för musikuppspelning eller för att registrera en löprunda.
En background service utför arbete som användaren inte ser direkt. Sedan Android 8.0 finns det strikta begränsningar för när appar får starta sådana services, och för många uppgifter rekommenderas WorkManager i stället. En bound service gör det möjligt för andra komponenter, till exempel en activity, att binda sig till den och kommunicera med den, och den körs bara så länge något är bundet till den.
Vad är skillnaden mellan en startad service och en bunden service?
En startad service startas med startService eller startForegroundService och körs tills den stoppar sig själv eller stoppas. Den utför vanligtvis en specifik uppgift och returnerar inte något resultat direkt till komponenten som startade den.
En bunden service startas när en annan komponent binder sig till den med bindService. Den tillhandahåller ett gränssnitt så att komponenten kan anropa metoder och ta emot svar, till exempel en activity som styr en musikspelare. När inga komponenter längre är bundna stoppas den. En service kan också vara båda samtidigt om den både är startad och bunden.
När bör WorkManager användas i stället för en service?
WorkManager är Googles rekommenderade lösning för bakgrundsarbete som måste utföras tillförlitligt, även om appen stängs eller enheten startas om. Det kan handla om att synkronisera data, ladda upp loggfiler eller periodisk rensning.
WorkManager respekterar systemets regler för batteri och bakgrundsaktivitet och kan ställas in så att det bara körs när enheten till exempel är ansluten till Wi-Fi eller laddas. En service, särskilt en foreground service, är mer relevant när arbetet behöver ske omedelbart och är synligt för användaren, till exempel musikuppspelning eller ett pågående samtal. För kortvarigt arbete medan appen är öppen räcker coroutines ofta.
Varför måste en foreground service visa en avisering?
En foreground service kan köras länge och använda resurser som processor, batteri och platsdata medan användaren inte har appen öppen. Android kräver därför att den visar en beständig avisering, så att användaren vet att appen arbetar i bakgrunden.
Det ger transparens och gör det möjligt för användaren att stoppa tjänsten eller öppna appen. I nyare Android-versioner måste utvecklare också deklarera en typ för tjänsten, till exempel mediauppspelning, plats eller datasynkronisering, och ha tillhörande behörigheter. Från och med Android 13 måste användaren dessutom ge behörighet för aviseringar, vilket påverkar hur aviseringen visas.
Vilka begränsningar sätter Android för bakgrundsarbete?
För att spara batteri och skydda användarens integritet har Android successivt infört begränsningar för bakgrundsarbete. Sedan Android 8.0 får appar i bakgrunden i regel inte starta vanliga background services, och systemet stoppar dem efter kort tid.
Doze-läget och App Standby skjuter upp nätverksåtkomst och jobb när enheten inte används eller appen sällan används. Nyare versioner kräver typer och behörigheter för foreground services och begränsar när de får startas från bakgrunden. Åtkomst till plats i bakgrunden kräver en separat behörighet. Bakgrundsarbete bör därför schemaläggas med WorkManager när det är möjligt.
Service för dummies
En service i en Android-app är en sorts osynlig hjälpreda som kan fortsätta arbeta även när ingen tittar på appen. Tänk på en musikapp: en låt kan startas, användaren kan gå tillbaka till hemskärmen och skriva ett meddelande, och musiken fortsätter att spelas. Det är en service som sköter det. När en app använder en service för något som användaren bör känna till visar telefonen en liten avisering, så att det är tydligt att appen arbetar. Samtidigt ser Android till att appar inte förbrukar för mycket ström i bakgrunden, så att batteriet räcker längre.