Akkunutzung für APIs zur Aufgabenplanung optimieren

Auf dieser Seite finden Sie einige Best Practices zum Einrichten von gut funktionierenden Hintergrundaufgaben. Diese Best Practices zielen speziell darauf ab, den Akkuverbrauch zu reduzieren, können aber auch die Geräteleistung auf andere Weise verbessern, z. B. durch eine Reduzierung der Netzwerknutzung.

Optimale Beschränkungen auswählen und Aufgaben kombinieren

Um die Last zu minimieren, die Ihre Aufgaben auf dem Gerät ausführen, ist es wichtig, optimale Einschränkungen festzulegen. Die Liste der Einschränkungen für JobScheduler-Jobs finden Sie unter JobInfo.Builder. Wenn Sie beispielsweise sicherstellen möchten, dass der Akku Ihrer App nicht zu schnell leer wird, empfiehlt es sich, die Einschränkung RequiresCharging anzugeben. Diese Einschränkung weist das System an, den Job nur auszuführen, wenn der Akkustand tatsächlich erhöht wird. Ebenso ist für die Nutzung eines WLANs in der Regel weniger Energie als für mobile Daten erforderlich. Wenn für Ihre Aufgabe also eine Netzwerkverbindung erforderlich ist, Sie aber warten können, bis ein kostenloses Netzwerk verfügbar ist, empfiehlt es sich, eine NetworkType.UNMETERED-Beschränkung festzulegen.

Wenn Sie mehrere ähnliche Aufgaben haben, für die dieselben Einschränkungen gelten, empfiehlt es sich in der Regel, diese zu einer einzigen Aufgabe zu kombinieren, damit das Gerät nur einmal geweckt wird. Angenommen, Ihre Anwendung hat drei verschiedene Datasets, die mit dem Cloud-Speicher synchronisiert werden müssen. Anstatt drei verschiedene Aufgaben – eine für jedes Dataset – zu planen, ist es in der Regel besser, nur eine einzelne Aufgabe zum Synchronisieren der Daten zu planen, entsprechende Einschränkungen festzulegen und diese Aufgabe die gesamte ausstehende Datensynchronisierung während der Ausführung erledigen zu lassen.

Sie sollten jedoch nicht versuchen, unabhängige Aufgaben in einer einzigen Alles-Möglichkeit zu kombinieren. Achten Sie stattdessen einfach darauf, jeder Aufgabe entsprechende Einschränkungen zuzuweisen. Wenn Aufgaben beispielsweise eine niedrige Priorität haben, geben Sie an, dass sie ausgeführt werden sollen, wenn das Gerät inaktiv ist und aufgeladen wird. Auf diese Weise wird die Nutzererfahrung nicht beeinträchtigt, auch wenn das Gerät mehrmals aufgeweckt wird. Auch die Akkulaufzeit wird dadurch nicht beeinträchtigt.

Markieren Sie Aufgaben nur dann als beschleunigt, wenn sie zeitkritisch sind

Wenn eine Aufgabe besonders dringend ist, können Sie sie als beschleunigt markieren. Rufen Sie bei JobScheduler-Jobs JobInfo.Builder.setExpedited(true) auf. Dadurch wird die Aufgabe auf verschiedene Arten priorisiert. Beispielsweise führt das System diese Aufgaben sofort aus, wenn es möglich ist, und Einschränkungen der Energieverwaltung wirken sich weniger wahrscheinlich auf beschleunigte Aufgaben aus.

Achten Sie deshalb darauf, eine Aufgabe nur dann als beschleunigt zu markieren, wenn es unbedingt erforderlich ist. Da beschleunigte Aufgaben eine gewisse Systemeffizienz überschreiben können, können beschleunigte Aufgaben mehr Strom verbrauchen, als sie es ohne die entsprechende Markierung tun würden.

Sie sollten eine Aufgabe nur dann als beschleunigt markieren, wenn sie zeitkritisch ist und die Nutzerfreundlichkeit beeinträchtigt wird, wenn die Ausführung der Aufgabe länger dauert. Wenn Ihre Anwendung beispielsweise eine Aufgabe zur Verarbeitung einer FCM-Nachricht mit hoher Priorität ausführt, ist dies ein geeigneter Grund, die Aufgabe als beschleunigt zu markieren. Sie sollten eine Aufgabe jedoch nicht als beschleunigt markieren, nur um Systemoptimierungen zu überschreiben.

Prüfen, warum Aufgaben angehalten wurden

Wenn Ihre Aufgaben beendet werden, bevor sie abgeschlossen sind, können Sie prüfen, warum sie angehalten wurden, indem Sie WorkInfo.getStopReason() aufrufen. Rufen Sie bei JobScheduler-Jobs JobParameters.getStopReason() auf. Dies hat verschiedene Gründe. Zunächst wollen Sie natürlich, dass Ihre Aufgaben erledigt werden. Wenn Sie herausfinden, warum Ihre Aufgaben angehalten wurden, können Sie ähnliche Situationen vermeiden. Es ist jedoch wahrscheinlich, dass das System Aufgaben aufgrund eines Verhaltens, das Systemressourcen übermäßig beansprucht, auch beendet. Sie möchten nicht, dass Ihre App unbrauchbar wird und den Akku oder das Netzwerk unnötig beansprucht.

Wenn Ihre Aufgaben beispielsweise häufig mit dem Grund STOP_REASON_TIMEOUT beendet werden, kann es einen Grenzfall geben, der dazu führt, dass Ihre Aufgaben viel länger als erwartet dauern.

Es empfiehlt sich, mithilfe der Analyse-Engine nachzuverfolgen, ob und aus welchen Gründen die Aufgaben Ihrer Anwendung beendet werden.