Background Service ist eine Android-Komponente, die für die Ausführung langlebiger Operationen im Hintergrund ohne Benutzeroberfläche entwickelt wurde. Im Gegensatz zu Activity arbeitet Service weiter, auch wenn die App minimiert wurde oder der Benutzer zu einer anderen App gewechselt ist. Laut Android Developers, 2026 gibt es drei Arten von Diensten: Started Service, Bound Service und Foreground Service, jeweils mit eigenem Lebenszyklus und Anwendungsbereich.
Das Wichtigste
Background Service (oder einfach Service) ist neben Activity, BroadcastReceiver und ContentProvider eine der vier grundlegenden Komponenten einer Android-App. Im Gegensatz zu Activity hat Service keine visuelle Oberfläche und ist für Operationen konzipiert, die unabhängig davon fortgesetzt werden müssen, ob die App im Vordergrund ist oder nicht.
Service läuft im Hauptthread der Anwendung, daher erfordern blockierende Operationen innerhalb des Dienstes die Erstellung eines separaten Threads. Andernfalls löst das System ANR (Application Not Responding) aus. Für einfache Hintergrundoperationen bietet Android IntentService an, der automatisch einen Worker-Thread erstellt. In modernen Projekten wird empfohlen, Kotlin-Coroutinen mit CoroutineScope innerhalb des Service für asynchrone Verarbeitung ohne Blockierung des Hauptthreads zu verwenden.
Der Hauptzweck von Service ist Musikwiedergabe, Dateidownload, Netzwerkanfragen, Datensynchronisation und andere Aufgaben, die fortgesetzt werden müssen, nachdem der Benutzer die App verlassen hat. Seit Android 8 müssen Entwickler jedoch bewusst zwischen den Servicetypen wählen und dabei die Einschränkungen der Hintergrundarbeit berücksichtigen.
Service hat seinen eigenen Lebenszyklus, der sich von Activity unterscheidet. Er umfasst vier Schlüsselmethoden: onCreate, onStartCommand, onBind und onDestroy. Das Verständnis dieses Zyklus ist für die korrekte Implementierung von Hintergrundaufgaben ohne Speicherlecks unerlässlich.
Die Methode onCreate wird bei der Erstellung des Dienstes einmalig aufgerufen. Hier werden Ressourcen wie Timer, Datenbankverbindungen und Sockets initialisiert. Die Methode onStartCommand wird jedes Mal aufgerufen, wenn startService aufgerufen wird, wodurch Befehle an einen bereits laufenden Dienst gesendet werden können. Der Rückgabewert bestimmt das Systemverhalten beim Neustart.
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 wird beim Binden des Dienstes über bindService aufgerufen und gibt ein IBinder-Objekt für die Client-Interaktion zurück. Diese Methode wird nur für Bound Service verwendet. onDestroy ist der letzte Aufruf vor der Zerstörung des Dienstes. Hier werden alle Ressourcen freigegeben, Threads gestoppt und Aufgaben abgebrochen.
Android bietet drei Arten von Service, die jeweils für ihr eigenes Szenario konzipiert sind. Die Wahl des falschen Typs kann zu instabilem App-Verhalten oder Batterieverbrauch führen.
Started Service wird durch Aufruf von startService gestartet und läuft, bis er stopSelf oder stopService aufruft. Er eignet sich für Aufgaben, die sofort ausgeführt werden müssen: Analytics senden, ein Bild verarbeiten, eine einzelne Datei herunterladen. Nach Abschluss seiner Arbeit stoppt der Dienst sich selbst.
Bound Service bietet eine Client-Server-Schnittstelle, die es einer Activity, einem Fragment oder einer anderen Komponente ermöglicht, mit dem Dienst zu interagieren. Der Dienst lebt, solange mindestens ein Client verbunden ist. Wenn alle Clients die Verbindung trennen, wird der Dienst zerstört. Bound Service eignet sich für Aufgaben, die eine bidirektionale Kommunikation erfordern: Musikplayer, Navigation.
Foreground Service ist ein Started Service mit einer dauerhaften Benachrichtigung in der Statusleiste. Das System betrachtet einen solchen Dienst als aktiv und beendet ihn auch bei Speichermangel nicht. Foreground Service ist für Musikwiedergabe, Audioaufnahme, Standortverfolgung und andere für den Benutzer wichtige Aufgaben obligatorisch.
| Parameter | Started | Bound | Foreground |
|---|---|---|---|
| Start | startService | bindService | startForeground |
| Lebensdauer | bis stopSelf | solange Clients existieren | bis stopForeground |
| Benachrichtigung | nein | nein | erforderlich |
| Beendbar | ja | ja | nein |
| Beispiel | Download | Player | Musik |
Das Erstellen eines Dienstes beginnt mit der Deklaration einer Klasse, die von Service erbt, und ihrer Registrierung in der AndroidManifest.xml. Ohne Registrierung im Manifest kann das System den Dienst nicht starten, und jeder Aufruf von startService führt zu einer Ausnahme.
// Registrierung 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
}
}
Um einen Dienst aus einer Activity oder einem Fragment zu starten, wird ein Intent mit einem expliziten Verweis auf die Dienstklasse verwendet. Ab Android 8 ist für Foreground Service die Berechtigung FOREGROUND_SERVICE im Manifest erforderlich.
// 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)
}
Ab Android 8 (API 26) hat Google strenge Einschränkungen für Hintergrunddienste eingeführt. Der Start von Hintergrunddiensten (wenn die App nicht im Vordergrund ist) ist nur in Ausnahmefällen erlaubt: beim Empfang einer Push-Benachrichtigung, nach dem Gerätestart oder über JobScheduler.
Für langlebige Aufgaben, die keine sofortige Ausführung erfordern, wird die Verwendung von WorkManager oder JobScheduler empfohlen. Wenn eine App wirklich einen laufenden Dienst benötigt, ist der einzige Weg ein Foreground Service mit einer für den Benutzer sichtbaren Benachrichtigung. Das Starten eines Dienstes ohne Benachrichtigung im Hintergrund wird vom System ignoriert.
JobIntentService ist eine spezialisierte Klasse, die in der Support-Bibliothek für Android 5+ erschienen ist. Sie kombiniert das Verhalten von IntentService (automatischer Worker-Thread, sequenzielle Verarbeitung) mit der Planung über JobScheduler. Auf Android 8+ verwendet JobIntentService intern JobScheduler, auf älteren Versionen einen regulären Service. Dies ermöglicht eine einheitliche Handhabung von Hintergrundaufgaben ohne zusätzliche Android-Versionsprüfungen.
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")
// Wird in einem Hintergrundthread ausgeführt
uploadFile(fileUri)
}
}
Ein häufiges Problem bei der Arbeit mit Background Service sind Speicherlecks. Da ein Service länger leben kann als eine Activity, verhindern Referenzen auf die Activity innerhalb des Service (über Listener, Callback oder Broadcast) die Garbage Collection von UI-Komponenten. Für die Service-UI-Kommunikation wird die Verwendung von WeakReference, ViewModel oder LiveData empfohlen. Vergessen Sie nicht, in onDestroy alle Abonnements zu kündigen, Threads zu stoppen und Cursor zu schließen.
Die Wahl zwischen Background Service und WorkManager hängt vom Szenario ab. Service eignet sich für Aufgaben, die sofort und kontinuierlich ausgeführt werden müssen: Musikwiedergabe, Audioaufnahme, GPS-Tracking. WorkManager ist besser für verzögerte, garantierte Aufgaben geeignet: Synchronisation, Analytics-Versand, Log-Upload. WorkManager überlebt Geräteneustarts, Service dagegen nicht. Service kann mit Benachrichtigung im Vordergrund sein, während WorkManager leise im Hintergrund arbeitet. In der Praxis kombinieren Entwickler beide Ansätze: Foreground Service für kritische Benutzeraufgaben und WorkManager für die Hintergrundwartung.
Android 12 führte das Flag android:foregroundServiceType ein, das die Angabe des Diensttyps erfordert: dataSync, camera, connectedDevice, location, mediaPlayback und andere. Eine falsche Typangabe führt beim Start zu einer Ausnahme. Diese Praxis macht Background Service sowohl für den Benutzer als auch für das System transparenter.
Die korrekte Service-Registrierung im Manifest umfasst das exported-Attribut (Zugänglichkeit für externe Apps), den foregroundServiceType (Hintergrunddiensttyp ab Android 12+) und die Berechtigung. Für Bound Service muss für JobIntentService auch android:permission="android.permission.BIND_JOB_SERVICE" deklariert werden. Ohne Registrierung im Manifest führt jeder startService- oder bindService-Aufruf zu einer Ausnahme, daher ist die Manifestprüfung der erste Schritt bei der Diagnose von Service-Problemen.
Häufig gestellte Fragen
Service wird im Hauptthread (UI-Thread) der Anwendung ausgeführt. Jede blockierende Operation innerhalb von onStartCommand oder onHandleIntent muss in einen separaten Thread oder eine Coroutine ausgelagert werden, andernfalls löst das System nach 5 Sekunden einen ANR aus.
IntentService ist eine Unterklasse von Service, die automatisch einen Worker-Thread erstellt und Befehle sequenziell verarbeitet. Nach Abschluss der letzten Aufgabe stoppt IntentService sich selbst. Ab Android 8 gilt IntentService als veraltet zugunsten von JobIntentService oder WorkManager.
Das Starten eines Started Service aus dem Hintergrund ist unter Android 12 verboten. Die Ausnahme ist ein Foreground Service mit deklariertem foregroundServiceType im Manifest und einer gültigen Benachrichtigung. Auch ein kurzer Start nach Erhalt einer hochprioritären FCM-Nachricht ist erlaubt.
Es gibt drei Methoden: BroadcastReceiver mit lokalem Broadcast, den Messenger-Mechanismus über Handler und LiveData/Flow in der MVVM-Architektur mit einem gemeinsamen ViewModel. Für Bound Service wird IBinder mit direkten Methodenaufrufen verwendet.
Wenn ein Service mit dem Flag START_STICKY gestartet wurde, startet das System ihn neu, nachdem der Prozess aufgrund von Speichermangel beendet wurde. Das Flag START_NOT_STICKY bedeutet, dass das System den Dienst nicht neu startet. START_REDELIVER_INTENT ähnelt START_STICKY, liefert jedoch den letzten Intent.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch