Übersicht über Hintergrundarbeiten

Häufig müssen Apps mehrere Dinge gleichzeitig erledigen. Die Android-APIs bieten dafür viele verschiedene Möglichkeiten. Die Wahl der richtigen Option ist sehr wichtig. Eine Option kann in einer Situation richtig sein, für eine andere aber sehr falsch. Die Auswahl der falschen APIs kann die Leistung oder Ressourceneffizienz Ihrer App beeinträchtigen, was den Akku stark beanspruchen 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 Play Store aufgeführt wird.

In diesem Dokument werden die verschiedenen Optionen erläutert, die Ihnen zur Verfügung stehen. So können Sie leichter die richtige Option für Ihre Situation auswählen.

Terminologie

Einige wichtige Begriffe im Zusammenhang mit Hintergrundarbeit können auf unterschiedliche, widersprüchliche Weise verwendet werden. Aus diesem Grund ist es wichtig, unsere Bedingungen zu definieren.

Wenn eine App im Hintergrund ausgeführt wird, werden vom System eine Reihe von Einschränkungen für sie festgelegt. Beispielsweise können in den meisten Fällen eine App im Hintergrund keine Dienste im Vordergrund starten.

In diesem Dokument bezieht sich der Begriff „Aufgabe“ auf einen Vorgang, den eine Anwendung außerhalb ihres Hauptworkflows ausführt. Für eine einheitliche Wahrnehmung haben wir dies in drei Hauptkategorien von Aufgaben unterteilt: asynchrone Arbeit, Hintergrundarbeit und Dienste im Vordergrund.

Die richtige Option auswählen

In den meisten Szenarien können Sie die richtigen APIs für Ihre Aufgabe ermitteln, indem Sie die Kategorie (asynchrone Arbeit, Hintergrundarbeit oder Dienste im Vordergrund) ermitteln, zu der die Aufgabe gehört.

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

Bei der Hintergrundarbeit sind zwei Hauptszenarien zu beachten:

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

Asynchrone Arbeit

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

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

Hintergrundarbeit

Hintergrundarbeit ist eine flexiblere Option, wenn Sie Aufgaben ausführen möchten, die auch dann weiter ausgeführt werden sollen, wenn der Nutzer die App verlässt. In den meisten Fällen ist die beste Option für Hintergrundarbeiten die Verwendung von WorkManager. In manchen Fällen kann jedoch auch die JobScheduler API der Plattform verwendet werden.

WorkManager ist eine leistungsstarke Bibliothek, mit der Sie nach Bedarf einfache oder komplizierte Jobs einrichten können. Mit WorkManager können Sie Aufgaben so planen, dass sie zu bestimmten Zeiten ausgeführt werden, oder die Bedingungen für die Ausführung der Aufgabe angeben. Sie können sogar Aufgabenketten einrichten, sodass jede Aufgabe nacheinander ausgeführt wird und die Ergebnisse an die nächste übergeben. Informationen zu allen verfügbaren Optionen finden Sie in der WorkManager-Funktionsliste.

Einige der häufigsten Szenarien für Hintergrundarbeit sind:

  • Daten werden regelmäßig vom Server abgerufen
  • Sensordaten abrufen (z. B. Schrittzählerdaten)
  • Regelmäßige Standortdaten abrufen (unter Android 10 oder höher ist die Berechtigung ACCESS_BACKGROUND_LOCATION erforderlich)
  • Inhalte basierend auf einem Inhaltstrigger 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 das Gerät jedoch stark belasten und manchmal haben sie Auswirkungen auf Datenschutz und Sicherheit. Aus diesen Gründen hat das System zahlreiche Einschränkungen dafür, wie und wann Apps Dienste im Vordergrund verwenden können. Beispielsweise muss ein Dienst im Vordergrund für den Nutzer erkennbar sein und 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, um einen Dienst im Vordergrund zu erstellen. Sie können Ihr eigenes Service deklarieren und angeben, dass der Dienst ein Dienst im Vordergrund ist, indem Sie Service.startForeground() aufrufen. Alternativ können Sie mit WorkManager einen Dienst im Vordergrund erstellen, wie unter Unterstützung für Worker mit langer Ausführungszeit beschrieben. Sie müssen jedoch wissen, dass ein von WorkManager erstellter Dienst im Vordergrund dieselben Einschränkungen wie jeder andere Dienst im Vordergrund erfüllen muss. WorkManager bietet nur einige praktische APIs, mit denen sich Dienste im Vordergrund einfacher erstellen lassen.

Alternative APIs

Das System bietet alternative APIs, die für spezifischere Anwendungsfälle eine bessere Leistung erzielen. Wenn für Ihren Anwendungsfall eine alternative API vorhanden ist, empfehlen wir, diese API anstelle eines Dienstes im Vordergrund zu verwenden, da damit die Leistung Ihrer Anwendung verbessert werden sollte. In der Dokumentation zu Typen von Diensten im Vordergrund wird angegeben, ob es eine gute alternative API anstelle eines bestimmten Diensttyps im Vordergrund gibt.

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

  • Verwenden von vom Nutzer initiierten Datenübertragungen für große Downloads oder Uploads, anstatt einen Dienst für die Datensynchronisierung im Vordergrund zu erstellen
  • Verwenden Sie für die Bluetooth-Kopplung und -Datenübertragung den Begleitgerätemanager, anstatt einen Dienst im Vordergrund zu verwenden, der mit dem verbundenen Gerät verbunden ist.
  • Verwendung des Bild-im-Bild-Modus zum Abspielen von Videos, anstatt einen Dienst für die Medienwiedergabe im Vordergrund zu erstellen

Vom Nutzer initiierte Aufgaben

Flussdiagramm zur Auswahl der passenden API In diesem Diagramm sind die Inhalte im Abschnitt „Vom Nutzer initiierte Aufgaben“ zusammengefasst.
Abbildung 1: Die richtige API zum Ausführen einer vom Nutzer initiierten Hintergrundaufgabe auswählen.

Wenn eine Anwendung im Hintergrund arbeiten muss und der Vorgang vom Nutzer initiiert wird, während die Anwendung sichtbar ist, beantworten Sie diese Fragen, um den richtigen Ansatz zu finden.

Muss die Task weiter ausgeführt werden, während die App im Hintergrund ausgeführt wird?

Wenn die Aufgabe nicht weiter ausgeführt werden muss, während die App im Hintergrund ausgeführt wird, sollten Sie die asynchrone Arbeit verwenden. Es gibt eine Reihe von Optionen für asynchrone Arbeiten. Wichtig ist, zu verstehen, dass diese Optionen nicht mehr funktionieren, wenn die App in den Hintergrund geht. Sie werden auch beendet, wenn die App heruntergefahren wird. Beispielsweise kann es sein, dass eine Social-Media-App ihren Inhaltsfeed aktualisieren möchte, den Vorgang aber nicht abschließen muss, wenn der Nutzer den Bildschirm verlässt.

Entsteht eine negative Nutzererfahrung, wenn die Aufgabe verschoben oder unterbrochen wird?

Sie müssen überlegen, ob die User Experience nicht beeinträchtigt wird, wenn eine Aufgabe verschoben oder abgebrochen wird. Wenn eine App beispielsweise ihre Assets aktualisieren muss, bemerken Nutzer möglicherweise nicht, ob der Vorgang sofort oder mitten in der Nacht erfolgt, während das Gerät aufgeladen wird. In solchen Fällen sollten Sie die Optionen für Hintergrundarbeiten verwenden.

Ist es eine kurze, wichtige 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 weniger Berechtigungen. Kurze Fahrten müssen jedoch innerhalb von drei Minuten abgeschlossen werden.

Gibt es dafür auch eine alternative API?

Wenn die Aufgabe für den Nutzer nicht unsichtbar ist, könnte die richtige Lösung die Verwendung eines Diensts im Vordergrund sein. Diese Dienste werden nach dem Start ununterbrochen ausgeführt, sodass sie eine gute Wahl sind, wenn eine Aufgabe unterbrochen werden sollte, was die Nutzerfreundlichkeit beeinträchtigt. Eine Trainings-Tracking-App kann zum Beispiel Standortsensoren verwenden, damit Nutzer ihre Joggingroute auf einer Karte aufzeichnen können. Bei einer Option für Hintergrundarbeiten sollten Sie dies nicht 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 nutzen können, gibt das System zahlreiche Einschränkungen dafür an, wann und wie sie verwendet werden können. In vielen Fällen können Sie anstelle eines Diensts im Vordergrund eine alternative API verwenden, die den Job für Sie einfacher übernimmt. Wenn Ihre Anwendung beispielsweise eine Aktion ausführen muss, wenn der Nutzer an einem bestimmten Ort ankommt, ist es am besten, die Geofence API zu verwenden, anstatt den Standort des Nutzers mit einem Dienst im Vordergrund zu verfolgen.

Aufgaben als Reaktion auf einen Termin

Flussdiagramm zur Auswahl der passenden API In diesem Diagramm sind die Inhalte des Abschnitts „Aufgaben als Reaktion auf ein Ereignis“ zusammengefasst.
Abbildung 2: Auswahl der richtigen API zum Ausführen einer ereignisgesteuerten Hintergrundaufgabe

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

Dies kann ein externer Trigger (z. B. eine FCM-Nachricht) oder die Reaktion auf einen von der App selbst festgelegten Alarm sein. Beispielsweise kann ein Spiel 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 lässt einige Sekunden Zeit, um solche Aufgaben auszuführen, auch wenn die App im Hintergrund ausgeführt wurde.

Wenn die Aufgabe länger als ein paar Sekunden dauert, kann es sinnvoll sein, einen Dienst im Vordergrund zu starten, um sie zu verarbeiten. Selbst wenn Ihre App derzeit im Hintergrund ausgeführt wird, kann sie berechtigt sein, einen Dienst im Vordergrund zu starten, wenn die Aufgabe vom Nutzer ausgelöst wurde und sie unter eine der genehmigten Ausnahmen von Einschränkungen beim Start im Hintergrund fällt. Wenn eine Anwendung beispielsweise eine FCM-Nachricht mit hoher Priorität erhält, 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 Hintergrundarbeit.