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 Hintergrundaufgaben können auf mehrere gegensätzliche 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 Abstimmung haben wir dies in drei Hauptkategorien von Aufgaben eingeteilt: asynchrone Arbeit, die APIs für die Aufgabenplanung und Dienste im Vordergrund.
Die richtige Option auswählen
In den meisten Szenarien können Sie die richtigen APIs für Ihre Aufgabe ermitteln. Dazu ermitteln Sie die Kategorie (asynchrone Arbeit, die APIs für die Aufgabenplanung oder Dienste im Vordergrund), unter die die Aufgabe fällt.
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 Hintergrundaufgaben sind zwei Hauptszenarien zu beachten:
- Die Aufgabe, die vom Nutzer initiiert wird, während die App sichtbar ist
- Die Aufgabe wird als Reaktion auf ein internes oder externes Ereignis initiiert
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 zu den APIs für Hintergrundaufgaben kann die asynchrone Arbeit nicht garantiert abgeschlossen werden, wenn sich die Anwendung nicht mehr in einer gültigen Lebenszyklusphase befindet (z. B. wenn sie den Vordergrund verlässt).
APIs für Aufgabenplanung
Die APIs für die Aufgabenplanung sind flexibler, wenn Sie Aufgaben ausführen müssen, die auch dann fortgesetzt werden müssen, wenn der Nutzer die App verlässt. Hintergrundaufgaben lassen sich in den meisten Fällen am besten mit WorkManager ausführen. In einigen Fällen ist es jedoch möglicherweise sinnvoll, die JobScheduler
API der Plattform zu verwenden.
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.
Zu den häufigsten Szenarien für Hintergrundaufgaben gehören:
- 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
Wenn eine Anwendung Hintergrundaufgaben ausführen 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 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?
Es ist wichtig, zu überlegen, ob die User Experience beeinträchtigt werden würde, 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
Manchmal muss eine App als Reaktion auf einen Trigger im Hintergrund Aufgaben ausführen, z. B.:
- Nachrichten an alle
- FCM-Nachrichten (Firebase Cloud Messaging)
- Von der App eingestellte Wecker
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 die APIs für die Aufgabenplanung.