Hintergrundaufgaben – Übersicht

Apps müssen häufig mehrere Dinge gleichzeitig tun. Die Android APIs bieten viele verschiedene Möglichkeiten, dies zu tun. Die richtige Option auszuwählen, ist sehr wichtig. Eine Option kann für eine Situation richtig, für eine andere aber sehr falsch sein. Die Auswahl der falschen APIs kann sich negativ auf die Leistung oder Ressourceneffizienz Ihrer App auswirken, was den Akku belasten und die Leistung des Geräts des Nutzers insgesamt beeinträchtigen kann. In einigen Fällen kann die falsche Vorgehensweise dazu führen, dass Ihre App nicht im Play Store gelistet wird.

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

Terminologie

Einige wichtige Begriffe im Zusammenhang mit Hintergrundaufgaben können auf unterschiedliche, sich widersprechende Weise 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. Beispielsweise kann eine App im Hintergrund in den meisten Fällen keine Dienste im Vordergrund starten.

In diesem Dokument wird der Begriff „Aufgabe“ als Vorgang bezeichnet, der von einer App außerhalb ihres Hauptworkflows ausgeführt wird. Um für Klarheit zu sorgen, haben wir diese in drei Hauptkategorien von Aufgabentypen unterteilt: asynchrone Arbeit, die 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 ermitteln, in die die Aufgabe fällt (asynchrone Arbeit, APIs zur Aufgabenplanung oder Dienste im Vordergrund).

Wenn Sie sich immer noch nicht sicher sind, können Sie die von uns bereitgestellten Flussdiagramme verwenden, die die Entscheidung noch genauer untermauern. Jede dieser Optionen wird später in diesem Dokument ausführlicher beschrieben.

Für Hintergrundaufgaben gibt es zwei Hauptszenarien:

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

Asynchrone Arbeit

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

Gängige Optionen für asynchrone Arbeit sind Kotlin-Coroutinen und Java-Threads. Weitere Informationen finden Sie in der Dokumentation zu asynchroner Arbeit. Im Gegensatz zu den APIs für Hintergrundaufgaben ist es nicht garantiert, dass asynchrone Aufgaben abgeschlossen werden, wenn die App sich nicht mehr in einer gültigen Lebenszyklusphase befindet, z. B. wenn die App den Vordergrund verlässt.

APIs zur Aufgabenplanung

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

WorkManager ist eine leistungsstarke Bibliothek, mit der Sie je nach Bedarf einfache oder komplexe Jobs 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 Aufgabe weitergibt. Eine Liste aller 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
  • Sensordaten abrufen (z. B. Daten der Schrittzählung)
  • Regelmäßige Standortdaten abrufen (Sie benötigen die Berechtigung ACCESS_BACKGROUND_LOCATION unter Android 10 oder höher)
  • Inhalte basierend auf einem Inhaltstrigger hochladen, z. B. Fotos, die mit der Kamera aufgenommen wurden

Dienste im Vordergrund

Dienste im Vordergrund bieten eine leistungsstarke Möglichkeit, Aufgaben sofort auszuführen, die nicht unterbrochen werden dürfen. 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 stark ein, wie und wann Apps Dienste im Vordergrund verwenden dürfen. Ein Dienst im Vordergrund muss beispielsweise für den Nutzer wahrnehmbar sein. In den meisten Fällen können Apps keine Dienste im Vordergrund starten, wenn sie im Hintergrund ausgeführt werden. Weitere Informationen finden Sie in der Dokumentation zu Diensten im Vordergrund.

Es gibt zwei Methoden zum Erstellen eines Dienstes im Vordergrund. Sie können Ihre eigene Service deklarieren und angeben, dass es sich um einen Dienst im Vordergrund handelt, indem Sie Service.startForeground() aufrufen. Alternativ können Sie mit WorkManager einen Dienst im Vordergrund erstellen, wie unter Unterstützung für langlaufende Worker beschrieben. Beachten Sie jedoch, dass ein von WorkManager erstellter Dienst im Vordergrund denselben Einschränkungen unterliegt wie jeder andere Dienst im Vordergrund. WorkManager bietet nur einige praktische APIs, die das Erstellen eines Dienstes im Vordergrund vereinfachen.

Alternative APIs

Das System bietet alternative APIs, die für bestimmte Anwendungsfälle eine bessere Leistung bieten. Wenn für Ihren Anwendungsfall eine alternative API verfügbar ist, empfehlen wir, diese anstelle eines Dienstes im Vordergrund zu verwenden. Dies sollte die Leistung Ihrer App verbessern. In der Dokumentation zu Diensttypen im Vordergrund wird angegeben, ob es eine gute alternative API gibt, die anstelle eines bestimmten Diensttyps im Vordergrund verwendet werden kann.

Zu den häufigsten Szenarien für die Verwendung alternativer APIs gehören:

Vom Nutzer initiierte Aufgaben

Flussdiagramm, das zeigt, wie die richtige API ausgewählt wird 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 eines von Nutzern initiierten Hintergrundtasks aus.

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

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

Wenn die Aufgabe nicht weiter ausgeführt werden muss, während die App im Hintergrund läuft, sollten Sie asynchrone Aufgaben verwenden. Es gibt verschiedene Möglichkeiten, asynchrone Aufgaben auszuführen. Wichtig ist, dass diese Optionen nicht mehr funktionieren, wenn die App im Hintergrund ausgeführt wird. Sie werden auch beendet, wenn die App geschlossen wird. Beispielsweise kann eine Social-Media-App ihren Inhaltsfeed aktualisieren, muss den Vorgang aber nicht abschließen, wenn der Nutzer den Bildschirm verlässt.

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

Es ist wichtig zu überlegen, ob die Nutzererfahrung beeinträchtigt wird, wenn eine Aufgabe verschoben oder abgesagt wird. Wenn beispielsweise die Assets einer App aktualisiert werden müssen, merkt der Nutzer möglicherweise nicht, ob der Vorgang sofort oder mitten in der Nacht ausgeführt wird, während das Gerät aufgeladen wird. In solchen Fällen sollten Sie die Optionen für Hintergrundaktivitäten 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 vom 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, ist die Verwendung eines Dienstes im Vordergrund möglicherweise die richtige Lösung. Diese Dienste werden nach dem Start kontinuierlich ausgeführt. Sie sind daher eine gute Wahl, wenn eine Unterbrechung der Aufgabe zu einer schlechten Nutzererfahrung führen würde. Eine App zum Aufzeichnen von Trainings könnte beispielsweise Standortsensoren verwenden, damit Nutzer ihre Joggingroute auf einer Karte aufzeichnen können. Das ist bei einer Option für die Hintergrundausführung nicht empfehlenswert, 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, schränkt das System ein, wann und wie sie verwendet werden können. 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 erfassen.

Aufgaben als Reaktion auf ein Ereignis

Flussdiagramm, das die Auswahl der richtigen API veranschaulicht In diesem Diagramm wird das Material im Abschnitt „Aufgaben als Reaktion auf ein Ereignis“ zusammengefasst.
Abbildung 2: So wählen Sie die richtige API für die Ausführung eines ereignisgetriggerten Hintergrundtasks aus.

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

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

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

Wenn die Aufgabe länger als einige Sekunden dauert, kann es sinnvoll sein, einen Dienst im Vordergrund zu starten, um die Aufgabe zu verarbeiten. Selbst wenn sich Ihre App derzeit im Hintergrund befindet, ist es unter Umständen zulässig, einen Dienst im Vordergrund zu starten, wenn die Aufgabe vom Nutzer ausgelöst wurde und in eine der zugelassenen Ausnahmen von den Einschränkungen für den Start im Hintergrund fällt. 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 einige Sekunden dauert, verwenden Sie die APIs zur Aufgabenplanung.