Hintergrundaufgaben – Übersicht

Apps müssen häufig mehrere Dinge gleichzeitig tun. Die Android APIs bieten viele verschiedene Möglichkeiten, dies zu tun. Die Wahl der richtigen Option ist sehr wichtig. Eine Option kann für eine Situation richtig, für eine andere aber völlig falsch sein. Die Auswahl der falschen APIs kann die Leistung oder Ressourceneffizienz Ihrer App beeinträchtigen, was den Akku entladen und die Leistung des Geräts des Nutzers insgesamt beeinträchtigen kann. In einigen Fällen kann die Wahl des falschen Ansatzes dazu führen, dass Ihre App nicht im Google Play Store aufgeführt wird.

In diesem Dokument werden die verschiedenen Optionen beschrieben, die Ihnen zur Verfügung stehen, und Sie erhalten Informationen dazu, wie Sie die richtige Option für Ihre Situation auswählen.

Terminologie

Einige wichtige Begriffe im Zusammenhang mit Hintergrundaufgaben können auf verschiedene, widersprüchliche Arten verwendet werden. Aus diesem Grund ist es wichtig, unsere Begriffe zu definieren.

Wenn eine App im Hintergrund ausgeführt wird, gelten für sie eine Reihe von Einschränkungen. In den meisten Fällen kann eine App im Hintergrund beispielsweise keine Dienste im Vordergrund starten.

In diesem Dokument wird der Begriff „Aufgabe“ für einen Vorgang verwendet, den eine App außerhalb ihres Hauptworkflows ausführt. Damit wir alle dasselbe Verständnis haben, haben wir die Aufgaben in drei Hauptkategorien unterteilt: asynchrone Arbeit, APIs zur Aufgabenplanung und Dienste im Vordergrund.

Die richtige Option auswählen

In den meisten Fällen können Sie die richtigen APIs für Ihre Aufgabe ermitteln, indem Sie die Kategorie (asynchrone Arbeit, APIs für die Aufgabenplanung oder Dienste im Vordergrund) ermitteln, unter die die Aufgabe fällt.

Wenn Sie sich immer noch nicht sicher sind, können Sie die von uns bereitgestellten Flussdiagramme verwenden, die die Entscheidung detaillierter darstellen. Jede dieser Optionen wird weiter unten in diesem Dokument ausführlicher beschrieben.

Für Hintergrundaufgaben gibt es zwei Hauptszenarien:

Für diese beiden Szenarien gibt es jeweils eigene Entscheidungsbäume.

Asynchrones Arbeiten

In vielen Fällen muss eine App nur gleichzeitige Vorgänge ausführen, während sie im Vordergrund ausgeführt wird. Beispielsweise muss eine App möglicherweise eine zeitaufwendige Berechnung durchführen. Wenn die Berechnung im UI-Thread ausgeführt würde, könnte der Nutzer erst nach Abschluss der Berechnung mit der App interagieren. Dies könnte zu einem ANR-Fehler führen. In einem solchen Fall sollte die App eine Option für asynchrone Arbeit verwenden.

Zu den gängigen Optionen für asynchrones Arbeiten gehören Kotlin-Koroutinen und Java-Threads. Weitere Informationen finden Sie in der Dokumentation zu asynchronem Arbeiten. Im Gegensatz zu den APIs für Hintergrundaufgaben ist bei asynchronen Aufgaben nicht garantiert, dass sie abgeschlossen werden, wenn sich die App nicht mehr in einer gültigen Lebenszyklusphase befindet (z. B. wenn die App den Vordergrund verlässt).

APIs für die Aufgabenplanung

Die APIs für die Aufgabenplanung sind eine flexiblere Option, wenn Sie Aufgaben ausführen müssen, die auch dann fortgesetzt werden sollen, wenn der Nutzer die App verlässt. In den meisten Fällen ist die beste Option für die Ausführung von Hintergrundaufgaben die Verwendung von WorkManager. In einigen Fällen kann es jedoch sinnvoll sein, die Plattform-API JobScheduler zu verwenden.

WorkManager ist eine leistungsstarke Bibliothek, mit der Sie einfache oder komplexe Jobs nach Bedarf einrichten können. Mit WorkManager können Sie Aufgaben so planen, dass sie zu bestimmten Zeiten ausgeführt werden, oder die Bedingungen angeben, unter denen die Aufgabe ausgeführt werden soll. Sie können sogar Aufgabenketten einrichten, sodass jede Aufgabe nacheinander ausgeführt wird und ihre Ergebnisse an die nächste weitergibt. Eine Übersicht über alle verfügbaren Optionen finden Sie in der Liste der WorkManager-Funktionen.

Zu den häufigsten Szenarien für Hintergrundaufgaben gehören:

  • Daten werden regelmäßig vom Server abgerufen
  • Abrufen von Sensordaten (z. B. Schrittzählerdaten)
  • Regelmäßige Standortdaten abrufen (Sie benötigen die Berechtigung ACCESS_BACKGROUND_LOCATION unter Android 10 oder höher)
  • Inhalte basierend auf einem Inhalts-Trigger hochladen, z. B. von der Kamera erstellte Fotos

Dienste im Vordergrund

Dienste im Vordergrund bieten eine leistungsstarke Möglichkeit, Aufgaben sofort auszuführen, die nicht unterbrochen werden sollten. Dienste im Vordergrund können jedoch das Gerät stark belasten und manchmal Auswirkungen auf den Datenschutz und die Sicherheit haben. Aus diesen Gründen schränkt das System die Nutzung von Diensten im Vordergrund durch Apps stark ein. Ein Dienst im Vordergrund muss beispielsweise für den Nutzer sichtbar sein. In den meisten Fällen können Apps keine Dienste im Vordergrund starten, wenn sie sich im Hintergrund befinden. Weitere Informationen finden Sie in der Dokumentation zu Diensten im Vordergrund.

Es gibt zwei Methoden, um einen Dienst im Vordergrund zu erstellen. Sie können Ihren eigenen Service deklarieren und angeben, dass der Dienst ein Dienst im Vordergrund ist, indem Sie Service.startForeground() aufrufen. Alternativ können Sie WorkManager verwenden, um einen Dienst im Vordergrund zu erstellen, wie unter Unterstützung für lang laufende Worker beschrieben. Es ist jedoch wichtig zu wissen, dass ein von WorkManager erstellter Dienst im Vordergrund denselben Einschränkungen unterliegt wie jeder andere Dienst im Vordergrund. WorkManager bietet lediglich einige praktische APIs, mit denen sich ein Dienst im Vordergrund einfacher erstellen lässt.

Alternative APIs

Das System bietet alternative APIs, die für spezifischere Anwendungsfälle eine bessere Leistung bieten. Wenn für Ihren Anwendungsfall eine alternative API vorhanden ist, empfehlen wir, diese API anstelle eines Dienstes im Vordergrund zu verwenden, da dies die Leistung Ihrer App verbessern sollte. In der Dokumentation zu Diensten im Vordergrund wird angegeben, wann es eine gute alternative API gibt, die anstelle eines bestimmten Dienstes im Vordergrund verwendet werden kann.

Hier einige der häufigsten Szenarien für die Verwendung alternativer APIs:

  • Vom Nutzer initiierte Datenübertragungen für große Downloads oder Uploads verwenden, anstatt einen Dienst im Vordergrund für die Datensynchronisierung zu erstellen
  • Verwendung des Companion Device Managers für die Bluetooth-Kopplung und Datenübertragung anstelle eines Dienstes im Vordergrund für verbundene Geräte
  • Verwendung des Bild-im-Bild-Modus für die Videowiedergabe, anstatt einen Dienst im Vordergrund für die Medienwiedergabe zu erstellen

Vom Nutzer initiierte Aufgaben

Flussdiagramm zur Auswahl der geeigneten API. In diesem Diagramm wird das Material im Abschnitt „Vom Nutzer initiierte Aufgaben“ zusammengefasst.
Abbildung 1: So wählen Sie die richtige API für die Ausführung einer vom Nutzer initiierten Hintergrundaufgabe aus.

Wenn eine App Hintergrundaufgaben ausführen muss und der Vorgang vom Nutzer initiiert wird, während die App sichtbar ist, beantworte diese Fragen, um den richtigen Ansatz zu finden.

Muss die Aufgabe weiter ausgeführt werden, während die App im Hintergrund läuft?

Wenn die Aufgabe nicht weiter ausgeführt werden muss, während sich die App im Hintergrund befindet, sollten Sie asynchrone Arbeit verwenden. Es gibt eine Reihe von Optionen für asynchrone Arbeit. Wichtig ist, dass alle diese Optionen nicht mehr funktionieren, wenn die App in den Hintergrund wechselt. (Sie werden auch beendet, wenn die App geschlossen wird.) Eine Social-Media-App möchte beispielsweise ihren Content-Feed aktualisieren, muss den Vorgang aber nicht abschließen, wenn der Nutzer den Bildschirm verlässt.

Wird die Nutzererfahrung beeinträchtigt, wenn die Aufgabe verschoben oder unterbrochen wird?

Es ist wichtig, zu berücksichtigen, ob die Nutzerfreundlichkeit beeinträchtigt wird, wenn eine Aufgabe verschoben oder abgebrochen wird. Wenn eine App beispielsweise ihre Assets aktualisieren muss, bemerkt der Nutzer möglicherweise nicht, ob der Vorgang sofort oder mitten in der Nacht während des Aufladens des Geräts erfolgt. In solchen Fällen sollten Sie die Optionen für Hintergrundarbeit verwenden.

Ist es eine kurze, kritische Aufgabe?

Wenn die Aufgabe nicht verzögert werden kann und schnell abgeschlossen wird, können Sie einen Dienst im Vordergrund mit dem Typ shortService verwenden. Diese Dienste sind einfacher zu erstellen als andere Dienste im Vordergrund und erfordern nicht so viele Berechtigungen. Kurze Dienste müssen jedoch innerhalb von drei Minuten abgeschlossen sein.

Gibt es eine alternative API nur für diesen Zweck?

Wenn die Aufgabe für den Nutzer nicht unsichtbar ist, kann die richtige Lösung darin bestehen, einen Dienst im Vordergrund zu verwenden. Diese Dienste werden nach dem Start kontinuierlich ausgeführt. Sie sind daher eine gute Wahl, wenn eine Unterbrechung der Aufgabe die Nutzerfreundlichkeit beeinträchtigen würde. Eine App zur Trainingsaufzeichnung kann beispielsweise Standortsensoren verwenden, damit Nutzer ihre Joggingroute auf einer Karte aufzeichnen können. Das sollten Sie nicht mit einer Hintergrundarbeitsoption tun, da das Tracking sofort beendet wird, wenn die Aufgabe pausiert wird. In einer solchen Situation ist ein Dienst im Vordergrund am sinnvollsten.

Da Dienste im Vordergrund jedoch potenziell viele Geräteressourcen verbrauchen können, gelten für ihre Verwendung strenge Einschränkungen. In vielen Fällen können Sie anstelle eines Dienstes im Vordergrund eine alternative API verwenden, die die Aufgabe mit weniger Aufwand für Sie erledigt. Wenn Ihre App beispielsweise eine Aktion ausführen muss, wenn der Nutzer an einem bestimmten Ort ankommt, sollten Sie die Geofence API verwenden, anstatt den Standort des Nutzers mit einem Dienst im Vordergrund zu verfolgen.

Aufgaben als Reaktion auf ein Ereignis

Flussdiagramm zur Auswahl der geeigneten API. In diesem Diagramm werden die Informationen im Abschnitt „Aufgaben als Reaktion auf ein Ereignis“ zusammengefasst.
Abbildung 2: So wählen Sie die richtige API für die Ausführung einer ereignisgesteuerten Hintergrundaufgabe aus.

Manchmal muss eine App als Reaktion auf einen Trigger Hintergrundarbeiten ausführen, z. B.:

Das kann ein externer Trigger (z. B. eine FCM-Nachricht) oder eine Reaktion auf einen von der App selbst festgelegten Alarm sein. Ein Spiel kann beispielsweise eine FCM-Nachricht erhalten, in der es aufgefordert wird, bestimmte Assets zu aktualisieren.

Wenn Sie sicher sind, dass die Aufgabe in wenigen Sekunden abgeschlossen ist, verwenden Sie asynchrone Arbeit, um die Aufgabe auszuführen. Das System gibt Ihrer App einige Sekunden Zeit, um solche Aufgaben auszuführen, auch wenn sie im Hintergrund ausgeführt wird.

Wenn die Aufgabe länger als ein paar Sekunden dauert, kann es sinnvoll sein, einen Dienst im Vordergrund zu starten, um die Aufgabe zu erledigen. Auch wenn sich Ihre App gerade im Hintergrund befindet, kann sie möglicherweise einen Dienst im Vordergrund starten, wenn die Aufgabe vom Nutzer ausgelöst wurde und eine der genehmigten Ausnahmen von den Einschränkungen für den Start im Hintergrund vorliegt. Wenn eine App beispielsweise eine FCM-Nachricht mit hoher Priorität empfängt, darf sie einen Dienst im Vordergrund starten, auch wenn sie im Hintergrund ausgeführt wird.

Wenn die Aufgabe länger als ein paar Sekunden dauert, verwenden Sie die APIs für die Aufgabenplanung.