Zeitüberschreitungen für Dienste im Vordergrund

Wenn eine App auf Android 15 oder höher ausgerichtet ist, schränkt das System die Laufzeit bestimmter Dienste im Vordergrund ein, während die App im Hintergrund ausgeführt wird. Derzeit gilt diese Einschränkung nur für Dienste im Vordergrund vom Typ dataSync und mediaProcessing. Für den Diensttyp im Vordergrund shortService gelten strengere Einschränkungen, die in der Dokumentation zu diesem Diensttyp beschrieben werden.

Verhalten bei Zeitüberschreitung

Das System lässt zu, dass Dienste im Vordergrund vom Typ dataSync und mediaProcessing innerhalb von 24 Stunden insgesamt 6 Stunden lang ausgeführt werden. Danach ruft das System die Methode Service.onTimeout(int, int) des laufenden Dienstes auf (eingeführt in Android 15). (Der Diensttyp im Vordergrund mediaProcessing wurde in Android 15 hinzugefügt.) Das Zeitlimit von sechs Stunden wird für dataSync- und mediaProcessing-Dienste separat erfasst. Wenn beispielsweise ein dataSync-Dienst eine Stunde lang ausgeführt wurde, stehen der App nur fünf Stunden für dataSync-Dienste im Vordergrund zur Verfügung, aber sechs Stunden für mediaProcessing-Dienste.

Wenn ein Dienst im Vordergrund das Limit von sechs Stunden erreicht, hat er einige Sekunden Zeit, um Service.stopSelf() aufzurufen. Wenn das System Service.onTimeout() aufruft, wird der Dienst nicht mehr als Dienst im Vordergrund betrachtet. Wenn der Dienst Service.stopSelf() nicht aufruft, löst das System eine interne Ausnahme aus. Die Ausnahme wird in Logcat mit der folgenden Meldung protokolliert:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

So vermeiden Sie Probleme mit dieser Verhaltensänderung:

  1. Lassen Sie Ihren Dienst die neue Service.onTimeout(int, int)-Methode implementieren. Wenn Ihre App den Callback empfängt, müssen Sie stopSelf() innerhalb weniger Sekunden aufrufen. Wenn Sie die Anwendung nicht sofort beenden, generiert das System einen Fehler.
  2. Achte darauf, dass die Dienste dataSync und mediaProcessing deiner App innerhalb von 24 Stunden nicht länger als insgesamt 6 Stunden ausgeführt werden, es sei denn, der Nutzer interagiert mit der App, wodurch der Timer zurückgesetzt wird.
  3. Starte dataSync- oder mediaProcessing-Dienste im Vordergrund nur als Ergebnis einer direkten Nutzerinteraktion. Da sich deine App beim Start des Dienstes im Vordergrund befindet, hat dein Dienst die vollen sechs Stunden, nachdem die App in den Hintergrund gewechselt ist.
  4. Verwenden Sie anstelle dieser Dienste im Vordergrund eine alternative API wie WorkManager. Anstatt einen dataSync-Dienst im Vordergrund zu verwenden, sollten Sie eine alternative API verwenden.

Wenn die Dienste im Vordergrund vom Typ dataSync Ihrer App in den letzten 24 Stunden 6 Stunden lang ausgeführt wurden, können Sie keinen weiteren Dienst im Vordergrund vom Typ dataSync starten, es sei denn, der Nutzer hat Ihre App in den Vordergrund gebracht (wodurch der Timer zurückgesetzt wird). Wenn Sie versuchen, einen weiteren dataSync-Dienst im Vordergrund zu starten, gibt das System ForegroundServiceStartNotAllowedException mit einer Fehlermeldung wie „Zeitlimit für Dienst im Vordergrund vom Typ dataSync bereits erreicht“ aus.

Test

Wenn Sie das Verhalten Ihrer App testen möchten, können Sie Zeitüberschreitungen für die Datensynchronisierung aktivieren, auch wenn Ihre App nicht auf Android 15 ausgerichtet ist (solange die App auf einem Android 15-Gerät ausgeführt wird). Führen Sie den folgenden adb-Befehl aus, um Zeitlimits zu aktivieren:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

Sie können auch den Zeitüberschreitungszeitraum anpassen, um das Verhalten Ihrer App bei Erreichen des Limits einfacher zu testen. Führen Sie den folgenden adb-Befehl aus, um ein neues Zeitlimit für dataSync-Dienste im Vordergrund festzulegen:

adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds

Führen Sie diesen Befehl aus, um ein neues Zeitlimit für mediaProcessing-Dienste im Vordergrund festzulegen:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds