Wenn eine App im Hintergrund läuft, verbraucht sie einen Teil der begrenzten Ressourcen des Geräts, wie z.B. RAM. Dies kann zu einer Beeinträchtigung des Benutzererlebnisses führen, insbesondere wenn der Benutzer eine ressourcenintensive App verwendet, wie z. B. ein Spiel oder ein Video. Um das Benutzererlebnis zu verbessern, schränkt Android 8.0 (API-Level 26) ein, was Apps tun können, während sie im Hintergrund laufen. Dieses Dokument beschreibt die Änderungen am Betriebssystem und wie Sie Ihre App aktualisieren können, damit sie unter den neuen Einschränkungen gut funktioniert.

Was ist der Dienst in Android?

Lassen Sie uns zunächst auffrischen, was der Dienst in Android ist? Gemäß der Android-Dokumentation:

Ein Service ist eine Anwendungskomponente, die lang laufende Operationen im Hintergrund ausführen kann und keine Benutzeroberfläche bietet.

Der Dienst ist also im Grunde dasselbe wie die Aktivität, hat aber keine UI-Komponente. Er muss also keine flüssige Animation mit 60 fps durchführen. Deshalb kann er jede Aufgabe für einen längeren Zeitraum als die Aktivität ausführen.

Es gibt drei Arten von Diensten:

  • Gestarteter Dienst – Ein Dienst wird gestartet, wenn eine Anwendungskomponente (z. B. eine Aktivität) startService() aufruft.
  • Gebundener Dienst – Ein Dienst wird gebunden, wenn eine Anwendungskomponente durch den Aufruf von bindService() an ihn gebunden wird.
  • Geplanter Dienst – Ein Dienst wird geplant, wenn eine API wie die JobScheduler.

Hintergrund- vs. Vordergrundanwendungen:

Um die Änderungen der Hintergrundausführung zu lernen, müssen wir zuerst den Unterschied zwischen Hintergrund- und Vordergrundanwendungen kennen.

Faustregel: Ihre Anwendung wird als Vordergrunddienst betrachtet, wenn einer der folgenden drei Fälle zutrifft:

  1. Ihre Anwendung hat derzeit sichtbare Aktivität.
  2. Ihre Anwendung hat einen Vordergrunddienst laufen.
  3. Ihre Anwendung ist mit einer anderen Vordergrundanwendung verbunden, indem sie den Dienst bindet oder deren Inhaltsanbieter konsumiert.

Wenn eines der oben genannten Szenarien in der aktuellen Instanz nicht zutrifft, wird Ihre Anwendung als im Hintergrund laufend betrachtet.

Warum müssen wir die Verwendung von Hintergrunddiensten einschränken?

Wenn Ihre Anwendungen im Hintergrund laufen und Dienste verwenden, verbraucht Ihre Anwendung zwei wertvolle Ressourcen: 1) Arbeitsspeicher und 2) Akku.

Diese beiden Ressourcen sind auf mobilen Geräten begrenzt, und die meisten Geräte der unteren bis mittleren Leistungsklasse verfügen nicht über viel Arbeitsspeicher oder Akku.

Angenommen, Ihre Anwendung führt im Hintergrund sehr intensive Aufgaben aus und verwendet eine große Menge an Arbeitsspeicher, um diese Aufgabe auszuführen, dann führt dies zu einer sehr schlechten Benutzererfahrung, insbesondere wenn der Benutzer eine andere ressourcenintensive Anwendung verwendet, z. B. ein Spiel spielt oder ein Video im Vordergrund anschaut.

Nach der Dokumentation für den gestarteten Dienst ist die beste Praxis,

Wenn der Vorgang abgeschlossen ist, sollte sich der Dienst selbst stoppen.

Aber viele Anwendungen haben lang laufende Hintergrunddienste, die im Grunde genommen unendlich lange laufen, um entweder die Socket-Verbindung mit dem Server aufrechtzuerhalten oder einige Aufgaben oder Benutzeraktivitäten zu überwachen. Diese Dienste belasten den Akku und verbrauchen ständig Speicher.

Seit den letzten Android-Versionen (beginnend mit Marshmallow) bemüht sich Google sehr darum, die Akkulaufzeit zu verlängern und den von den Anwendungen verbrauchten Speicher zu reduzieren, indem es den Ruhezustand und den App-Standby-Modus einführt, indem es die Ausführung im Hintergrund um eine gewisse Zeit verzögert, wenn das Telefon im Leerlauf ist.

Aber in den meisten Fällen verwenden die Entwickler trotz des Wissens um die Nachteile der langlaufenden Dienste diese immer noch. (Meistens, weil sie einfach zu implementieren und zu warten sind, anstatt andere Workarounds zu verwenden.)