Was ist ein Service, und wie funktioniert er in der App-Entwicklung?

Ein Service ist eine Komponente unter Android, die Arbeit ausführen kann, ohne eine eigene Benutzeroberfläche zu haben, etwa Musik abspielen, Daten synchronisieren oder eine laufende Dateiübertragung. Zusammen mit Activities, Broadcast Receivern und Content Providern gehören Services zu den vier grundlegenden App-Komponenten unter Android und müssen wie die anderen in der AndroidManifest.xml der App registriert sein. Standardmäßig läuft ein Service auf dem Main Thread der App, weshalb aufwendige Arbeit weiterhin in einen Hintergrund-Thread verlagert werden muss.

Android unterscheidet zwischen gestarteten Services, die eine Aufgabe ausführen, bis sie gestoppt werden, und gebundenen Services, an die sich andere Komponenten binden und mit denen sie kommunizieren können. Ein Foreground Service führt Arbeit aus, die dem Nutzer bewusst ist, und muss eine dauerhafte Benachrichtigung anzeigen. Da Hintergrundarbeit Akkulaufzeit und Performance beeinflusst, hat Android schrittweise Einschränkungen eingeführt, wann Apps Services im Hintergrund starten dürfen, und für aufschiebbare Arbeit empfiehlt Google typischerweise stattdessen WorkManager.

Ein Service ist unter Android eine App-Komponente, die Arbeit ohne eigene Benutzeroberfläche ausführt, etwa Musikwiedergabe, Synchronisation oder Dateiübertragungen. Er kann gestartet werden, um eine Aufgabe auszuführen, oder von anderen Komponenten gebunden werden, die mit ihm kommunizieren wollen. Foreground Services zeigen eine dauerhafte Benachrichtigung an, damit der Nutzer weiß, dass die Arbeit stattfindet, und wegen der Einschränkungen von Android für Hintergrundarbeit wird für aufschiebbare Aufgaben oft WorkManager verwendet.

Mehr über Service

Ein Service ist eine der vier grundlegenden Komponenten einer Android-App, zusammen mit Activities, Broadcast Receivern und Content Providern. Während eine Activity einen Bildschirm anzeigt, mit dem der Nutzer interagiert, wird ein Service für Arbeit verwendet, die keine Benutzeroberfläche erfordert oder weiterlaufen muss, auch wenn der Nutzer den Bildschirm verlässt. Typische Beispiele sind das Abspielen von Musik oder Podcasts, Navigation, das Hochladen von Dateien und die Synchronisation von Daten mit einem Server.

Technisch ist ein Service eine Klasse, die von android.app.Service erbt und mit einem service-Element in der AndroidManifest.xml registriert wird. Das System steuert den Lifecycle des Service über Methoden wie onCreate(), onStartCommand(), onBind() und onDestroy(). Wichtig ist, dass ein Service nicht automatisch auf einem separaten Thread läuft. Standardmäßig wird sein Code auf dem Main Thread der App ausgeführt, weshalb lang laufende oder blockierende Arbeit in einen Hintergrund-Thread verlagert werden muss, etwa mit Kotlin Coroutines, damit die App nicht unbenutzbar wird.

Services lassen sich auf verschiedene Arten einsetzen, die jeweils zu unterschiedlichen Anforderungen passen:

  1. Foreground Service: Führt Arbeit aus, die dem Nutzer bewusst ist, etwa Musikwiedergabe oder die aktive Aufzeichnung eines Trainings. Ein Foreground Service muss eine dauerhafte Benachrichtigung anzeigen, und in neueren Android-Versionen muss die App einen Service-Typ deklarieren und die zugehörigen Berechtigungen besitzen.

  2. Background Service: Führt Arbeit aus, die der Nutzer nicht direkt sieht. Seit Android 8.0 gelten strenge Einschränkungen dafür, wann Apps solche Services starten dürfen, während sie selbst im Hintergrund sind.

  3. Bound Service: Bietet eine Client-Server-Schnittstelle, über die sich andere Komponenten, auch aus anderen Apps, an den Service binden, Anfragen senden und Antworten erhalten können. Ein Bound Service lebt so lange, wie mindestens eine Komponente an ihn gebunden ist.

Eine der größten Stärken von Services ist, dass eine App wichtige Arbeit fortsetzen kann, ohne an einen bestimmten Bildschirm gebunden zu sein. Zugleich erfordern sie Sorgfalt, da Arbeit im Hintergrund Akku, Speicher und Daten verbraucht. Android hat daher schrittweise Regeln eingeführt, die Hintergrundarbeit einschränken, und Nutzer können Apps, die Foreground Services ausführen, sehen und stoppen.

Für viele Aufgaben empfiehlt Google stattdessen WorkManager, das Teil von Android Jetpack ist. WorkManager ist für Arbeit gedacht, die zuverlässig ausgeführt werden muss, selbst wenn die App geschlossen oder das Gerät neu gestartet wird, und die sich aufschieben lässt, etwa das Hochladen von Logdateien oder eine regelmäßige Synchronisation. WorkManager berücksichtigt die Einschränkungen des Systems und lässt sich mit Bedingungen wie einer Netzwerkverbindung oder dem Laden konfigurieren.

Zusammenfassend ist ein Service die richtige Wahl, wenn eine App laufende Arbeit ausführen muss, deren Fortsetzung der Nutzer erwartet, oder wenn andere Komponenten mit einem lang laufenden Prozess kommunizieren müssen. Durch die Wahl des richtigen Service-Typs oder von WorkManager, wenn sich die Arbeit aufschieben lässt, können Entwickler Apps bauen, die zugleich funktional und schonend für die Ressourcen des Geräts sind.

Häufig gestellte Fragen über Service

Was ist ein Service unter Android?

Ein Service ist eine Komponente unter Android, die Arbeit im Hintergrund ausführt, ohne eine eigene Benutzeroberfläche zu haben. Er wird für Aufgaben verwendet, die weiterlaufen müssen, auch wenn der Nutzer die App nicht ansieht, etwa Musik abspielen, eine laufende Navigation oder das Hochladen von Dateien.

Ein Service muss in der Datei AndroidManifest.xml deklariert werden. Wichtig ist, dass ein Service standardmäßig auf dem Main Thread der App läuft. Aufwendige Aufgaben müssen daher weiterhin in einen Hintergrund-Thread oder eine Coroutine verlagert werden. In neueren Android-Versionen gibt es zudem strenge Regeln dafür, wann Apps im Hintergrund laufen dürfen, um Akku zu sparen.

Welche Arten von Services gibt es unter Android?

Android unterscheidet zwischen drei Arten von Services. Ein Foreground Service führt eine Aufgabe aus, die dem Nutzer bewusst ist, und muss eine Benachrichtigung anzeigen, solange er läuft. Er wird beispielsweise für Musikwiedergabe oder die Aufzeichnung eines Laufs verwendet.

Ein Background Service führt Arbeit aus, die der Nutzer nicht direkt sieht. Seit Android 8.0 gelten strenge Einschränkungen dafür, wann Apps solche Services starten dürfen, und für viele Aufgaben wird stattdessen WorkManager empfohlen. Ein Bound Service ermöglicht es anderen Komponenten, etwa einer Activity, sich an ihn zu binden und mit ihm zu kommunizieren, und er läuft nur, solange etwas an ihn gebunden ist.

Was ist der Unterschied zwischen einem gestarteten und einem gebundenen Service?

Ein gestarteter Service wird mit startService oder startForegroundService gestartet und läuft, bis er sich selbst stoppt oder gestoppt wird. Er führt typischerweise eine bestimmte Aufgabe aus und gibt kein Ergebnis direkt an die Komponente zurück, die ihn gestartet hat.

Ein gebundener Service wird gestartet, wenn sich eine andere Komponente mit bindService an ihn bindet. Er stellt eine Schnittstelle bereit, über die die Komponente Methoden aufrufen und Antworten erhalten kann, etwa eine Activity, die einen Musikplayer steuert. Sind keine Komponenten mehr gebunden, wird er gestoppt. Ein Service kann auch beides zugleich sein, wenn er sowohl gestartet als auch gebunden ist.

Wann sollte WorkManager statt eines Service verwendet werden?

WorkManager ist die von Google empfohlene Lösung für Hintergrundarbeit, die zuverlässig ausgeführt werden muss, selbst wenn die App geschlossen oder das Gerät neu gestartet wird. Das kann die Synchronisation von Daten, das Hochladen von Logdateien oder ein regelmäßiges Aufräumen sein.

WorkManager hält die Regeln des Systems für Akku und Hintergrundaktivität ein und lässt sich so einstellen, dass er nur läuft, wenn das Gerät beispielsweise mit dem WLAN verbunden ist oder lädt. Ein Service, besonders ein Foreground Service, ist eher dann relevant, wenn die Arbeit sofort stattfinden muss und für den Nutzer sichtbar ist, etwa Musikwiedergabe oder ein laufender Anruf. Für kurzlebige Arbeit, während die App geöffnet ist, reichen oft Coroutines aus.

Warum muss ein Foreground Service eine Benachrichtigung anzeigen?

Ein Foreground Service kann lange laufen und Ressourcen wie Prozessor, Akku und Standortdaten nutzen, während der Nutzer die App nicht geöffnet hat. Android verlangt daher, dass er eine dauerhafte Benachrichtigung anzeigt, damit der Nutzer weiß, dass die App im Hintergrund arbeitet.

Das schafft Transparenz und ermöglicht es dem Nutzer, den Service zu stoppen oder die App zu öffnen. In neueren Android-Versionen müssen Entwickler zudem einen Typ für den Service deklarieren, etwa Medienwiedergabe, Standort oder Datensynchronisation, und die zugehörigen Berechtigungen besitzen. Ab Android 13 muss der Nutzer außerdem die Berechtigung für Benachrichtigungen erteilen, was beeinflusst, wie die Benachrichtigung angezeigt wird.

Welche Einschränkungen legt Android für Hintergrundarbeit fest?

Um Akku zu sparen und die Privatsphäre des Nutzers zu schützen, hat Android schrittweise Einschränkungen für Hintergrundarbeit eingeführt. Seit Android 8.0 dürfen Apps im Hintergrund in der Regel keine gewöhnlichen Background Services starten, und das System stoppt sie nach kurzer Zeit.

Doze-Modus und App Standby verzögern Netzwerkzugriffe und Jobs, wenn das Gerät nicht genutzt wird oder die App selten verwendet wird. Neuere Versionen verlangen Typen und Berechtigungen für Foreground Services und schränken ein, wann sie aus dem Hintergrund gestartet werden dürfen. Der Zugriff auf den Standort im Hintergrund erfordert eine eigene Berechtigung. Hintergrundarbeit sollte daher nach Möglichkeit mit WorkManager geplant werden.

Service für Dummies

Ein Service in einer Android-App ist eine Art unsichtbarer Helfer, der weiterarbeiten kann, selbst wenn niemand auf die App schaut. Stell dir eine Musik-App vor: Du startest ein Lied, gehst zurück zum Startbildschirm und schreibst eine Nachricht, und die Musik spielt weiter. Darum kümmert sich ein Service. Nutzt eine App einen Service für etwas, das du wissen solltest, zeigt das Handy eine kleine Benachrichtigung an, damit klar ist, dass die App arbeitet. Gleichzeitig sorgt Android dafür, dass Apps im Hintergrund nicht zu viel Strom verbrauchen, damit der Akku länger hält.

Schreibe einen Kommentar