Zeitüberschreitungen für Dienste im Vordergrund

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

Verhalten bei Zeitüberschreitung

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

Wenn ein Dienst im Vordergrund die Zeitbegrenzung von sechs Stunden erreicht, hat er einige Sekunden Zeit, um Service.stopSelf() aufzurufen. Wenn das System Service.onTimeout() aufruft, gilt der Dienst nicht mehr als Dienst im Vordergrund. 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]"

Um Probleme mit dieser Verhaltensänderung zu vermeiden, können Sie einen oder mehrere der folgenden Schritte ausführen:

  1. Implementieren Sie die neue Methode Service.onTimeout(int, int) in Ihrem Dienst. Wenn Ihre App den Callback empfängt, rufen Sie innerhalb weniger Sekunden stopSelf() auf. Wenn Sie die App nicht sofort beenden, generiert das System einen Fehler.
  2. Achten Sie darauf, dass die dataSync- und mediaProcessing-Dienste Ihrer App in einem Zeitraum von 24 Stunden nicht länger als insgesamt sechs Stunden ausgeführt werden, es sei denn, der Nutzer interagiert mit der App und setzt den Timer zurück.
  3. Starten Sie Dienste im Vordergrund vom Typ dataSync oder mediaProcessing nur als Folge einer direkten Nutzerinteraktion. Da sich Ihre App beim Start des Dienstes im Vordergrund befindet, hat Ihr Dienst die vollen sechs Stunden zur Verfügung, nachdem die App in den Hintergrund wechselt.
  4. Verwenden Sie anstelle dieser Dienste im Vordergrund eine alternative API wie WorkManager. Verwenden Sie insbesondere anstelle eines dataSyncDienstes im Vordergrund eine alternative API.

Wenn die dataSync-Dienste im Vordergrund Ihrer App in den letzten 24 Stunden sechs Stunden lang ausgeführt wurden, können Sie keinen weiteren dataSync-Dienst im Vordergrund starten, es sei denn der Nutzer hat Ihre App in den Vordergrund geholt (wodurch der Timer zurückgesetzt wird). Wenn Sie versuchen, einen weiteren dataSync Dienst im Vordergrund zu starten, löst das System ForegroundServiceStartNotAllowedException mit einer Fehlermeldung wie „Time limit already exhausted for foreground service type dataSync“ aus.

Test

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

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

Sie können auch den Zeitraum für die Zeitüberschreitung anpassen, um einfacher zu testen, wie sich Ihre App verhält, wenn die Zeitbegrenzung erreicht ist. Führen Sie den folgenden adb-Befehl aus, um einen neuen Zeitraum für die Zeitüberschreitung 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 einen neuen Zeitraum für die Zeitüberschreitung für mediaProcessing-Dienste im Vordergrund festzulegen:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds