Background Service — är en Android-komponent designad för att utföra långvariga operationer i bakgrunden utan användargränssnitt. Till skillnad från Activity fortsätter Service att fungera även efter att applikationen har minimerats eller användaren har växlat till en annan applikation. Enligt Android Developers, 2026 finns det tre typer av tjänster: Started Service, Bound Service och Foreground Service, var och en med sin egen livscykel och tillämpningsområde.
Huvudpunkter
Background Service (eller bara Service) — är en av de fyra grundläggande komponenterna i en Android-applikation tillsammans med Activity, BroadcastReceiver och ContentProvider. Till skillnad från Activity har Service inget visuellt gränssnitt och är avsedd för operationer som måste fortsätta oavsett om applikationen är i förgrunden eller inte.
Service körs i applikationens huvudtråd (main thread), så alla blockerande operationer inuti den kräver att en separat tråd skapas. Om detta inte görs kommer systemet att orsaka ANR (Application Not Responding). För enkla bakgrundsoperationer tillhandahåller Android IntentService, som automatiskt skapar en arbetstråd. I moderna projekt rekommenderas att använda Kotlin-korutiner med CoroutineScope inuti Service för asynkron bearbetning utan att blockera huvudtråden.
Huvudsyftet med Service är att spela musik, ladda ner filer, arbeta med nätverksförfrågningar, synkronisera data och andra uppgifter som måste fortsätta efter att användaren lämnar applikationen. Men med lanseringen av Android 8 måste utvecklare medvetet välja mellan typer av tjänster med hänsyn till begränsningarna för bakgrundsarbete.
Service har sin egen livscykel som skiljer sig från Activity. Den omfattar fyra viktiga metoder: onCreate, onStartCommand, onBind och onDestroy. Förståelse av denna cykel är nödvändig för korrekt implementering av bakgrundsuppgifter utan minnesläckor.
Metoden onCreate anropas när tjänsten skapas, en gång under dess livstid. I den initialiseras resurser: timer, databaskopplingar, sockets. Metoden onStartCommand anropas varje gång startService anropas, vilket gör det möjligt att skicka kommandon till en redan körande tjänst. Returvärdet bestämmer systemets beteende vid omstart.
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 anropas när tjänsten binds via bindService och returnerar ett IBinder-objekt för interaktion med klienten. Denna metod används endast för Bound Service. onDestroy — det sista anropet före förstörelse av tjänsten. I den frigörs alla resurser, stoppade trådar och avbrutna uppgifter.
Android erbjuder tre typer av Service, var och en designad för sitt eget scenario. Att välja fel typ kan leda till instabil applikationsprestanda eller batteriförbrukning.
Started Service startas genom anrop till startService och körs tills den anropar stopSelf eller stopService. Den passar för uppgifter som måste utföras omedelbart: skicka analysdata, bildbehandling, ladda ner en fil. Efter att arbetet är klart stoppar tjänsten sig själv.
Bound Service tillhandahåller ett klient-server-gränssnitt som gör det möjligt för Activity, Fragment eller annan komponent att interagera med tjänsten. Tjänsten lever så länge det finns minst en bunden klient. När alla klienter kopplar bort förstörs tjänsten. Bound Service är praktisk för uppgifter som kräver tvåvägskommunikation: musikspelare, navigering.
Foreground Service — är en Started Service med ett permanent meddelande i statusfältet. Systemet betraktar denna tjänst som aktiv och dödar den inte ens vid minnesbrist. Foreground Service är obligatorisk för musikuppspelning, ljudinspelning, platsövervakning och andra uppgifter som är viktiga för användaren.
| Parameter | Started | Bound | Foreground |
|---|---|---|---|
| Start | startService | bindService | startForeground |
| Livslängd | tills stopSelf | så länge klienter finns | tills stopForeground |
| Meddelande | nej | nej | obligatoriskt |
| Dödas | ja | ja | nej |
| Exempel | nedladdning | spelare | musik |
Att skapa en tjänst börjar med att deklarera en klass som ärver från Service och registrera den i AndroidManifest.xml. Utan registrering i manifestet kan systemet inte starta tjänsten, och varje anrop till startService kommer att resultera i ett undantag.
// Registrering i 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
}
}
För att starta en tjänst från Activity eller Fragment används Intent med explicit angivande av tjänstklassen. Från och med Android 8 krävs FOREGROUND_SERVICE-behörighet i manifestet för Foreground Service.
// Starta Started Service
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)
// Starta Foreground Service (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
Från och med Android 8 (API 26) införde Google strikta begränsningar för bakgrundstjänster. Start av Service i bakgrunden (när applikationen inte är i förgrunden) är endast tillåten i undantagsfall: vid mottagning av push-meddelande, efter enhetsstart eller via JobScheduler.
För långvariga uppgifter som inte kräver omedelbar körning rekommenderas att använda WorkManager eller JobScheduler. Om applikationen verkligen behöver en körande tjänst är det enda sättet Foreground Service med ett meddelande som användaren ser. Start av tjänst utan meddelande i bakgrunden kommer att ignoreras av systemet.
JobIntentService — är en specialiserad klass som dök upp i support library för att fungera på Android 5+. Den kombinerar beteendet hos IntentService (automatisk arbetstråd, sekventiell bearbetning) med schemaläggning via JobScheduler. På Android 8+ använder JobIntentService JobScheduler under huven, medan den på äldre versioner använder en vanlig Service. Detta gör det möjligt att enhetligt bearbeta bakgrundsuppgifter utan extra versionskontroller av 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")
// Körs i bakgrundstråd
uploadFile(fileUri)
}
}
Ett av de vanliga problemen vid arbete med Background Service är minnesläckor. Eftersom Service kan leva längre än Activity leder referenser till Activity inuti Service (via listener, callback eller broadcast) till att UI-komponenter inte kan skräpsamlas. Det rekommenderas att använda WeakReference, ViewModel eller LiveData för att koppla Service till UI. I onDestroy måste alla prenumerationer avbrytas, trådar stoppas och markörer stängas.
Valet mellan Background Service och WorkManager beror på scenariot. Service passar för uppgifter som måste utföras omedelbart och kontinuerligt: musikuppspelning, ljudinspelning, GPS-spårning. WorkManager är bättre för fördröjda, garanterade uppgifter: synkronisering, skicka analysdata, ladda upp loggar. WorkManager överlever enhetsomstart, medan Service inte gör det. Service kan vara Foreground med meddelande, medan WorkManager arbetar tyst i bakgrunden. I praktiken kombinerar utvecklare båda metoderna: Foreground Service för kritiska användaruppgifter och WorkManager för bakgrundsunderhåll.
Android 12 införde flaggan android:foregroundServiceType, som kräver att tjänstetypen anges: dataSync, camera, connectedDevice, location, mediaPlayback och andra. Felaktig typangivelse leder till undantag vid start. Denna praxis gör Background Service mer transparent för användaren och systemet.
Korrekt registrering av Service i manifestet inkluderar attributen exported (tillgänglighet för externa applikationer), foregroundServiceType (typ av bakgrundstjänst på Android 12+) och permission. För Bound Service måste även android:permission="android.permission.BIND_JOB_SERVICE" deklareras för JobIntentService. Utan registrering i manifestet kommer varje anrop till startService eller bindService att resultera i ett undantag, så kontroll av manifestet är det första steget vid diagnos av problem med Service.
Vanliga frågor
Service körs i applikationens huvudtråd (UI-tråden). Alla blockerande operationer inuti onStartCommand eller onHandleIntent måste flyttas till en separat tråd eller korutin, annars kommer systemet att orsaka ANR inom 5 sekunder.
IntentService — är en underklass till Service som automatiskt skapar en arbetstråd och bearbetar kommandon sekventiellt. Efter att den sista uppgiften är klar stoppar IntentService sig själv. Från och med Android 8 anses IntentService vara föråldrad till förmån för JobIntentService eller WorkManager.
Start av Started Service från bakgrunden på Android 12 är förbjuden. Undantaget är Foreground Service med deklarerad foregroundServiceType i manifestet och giltigt meddelande. En kort start efter mottagning av ett högprioriterat FCM-meddelande är också tillåten.
Det finns tre sätt: BroadcastReceiver med lokal sändning, Messenger-mekanismen via Handler, och LiveData/Flow i MVVM-arkitektur med delad ViewModel. För Bound Service används IBinder med direkt metodanrop.
Om Service startades med flaggan START_STICKY kommer systemet att starta om den efter att processen förstörts på grund av minnesbrist. Flaggan START_NOT_STICKY innebär att systemet inte kommer att starta om tjänsten. START_REDELIVER_INTENT liknar START_STICKY men skickar det senaste Intent.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också