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 Ihre App im Hintergrund läuft. Derzeit gilt diese Einschränkung nur für Dienste im Vordergrund vom Typ dataSync und mediaProcessing. Für den Diensttyp shortService gelten strengere Einschränkungen, die in der Dokumentation dieses Diensttyps beschrieben werden.

Verhalten bei Zeitüberschreitung

Das System lässt die Ausführung von dataSync- und mediaProcessing-Diensten im Vordergrund innerhalb von 24 Stunden für insgesamt 6 Stunden zu. Anschließend ruft das System die Methode Service.onTimeout(int, int) des laufenden Dienstes auf (in Android 15 eingeführt). Der Typ mediaProcessing wurde in Android 15 hinzugefügt. Die sechsstündige Frist wird für dataSync- und mediaProcessing-Dienste getrennt erfasst. Wenn ein dataSync-Dienst beispielsweise nur eine Stunde lang ausgeführt wurde, stehen der App nur fünf Stunden für mediaProcessing-Dienste im Vordergrund zur Verfügung, aber volle sechs Stunden für dataSync-Dienste.

Wenn ein Dienst im Vordergrund das Limit von sechs Stunden erreicht, hat er einige Sekunden Zeit, 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, wirft das System eine interne Ausnahme. 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]"

Sie können eine oder mehrere der folgenden Maßnahmen ergreifen, um Probleme mit dieser Verhaltensänderung zu vermeiden:

  1. Implementieren Sie in Ihrem Dienst die neue Service.onTimeout(int, int)-Methode. Wenn Ihre App den Callback empfängt, müssen Sie innerhalb weniger Sekunden stopSelf() anrufen. Wenn Sie die Anwendung nicht sofort beenden, tritt ein Fehler auf.
  2. Die Dienste dataSync und mediaProcessing Ihrer Anwendung dürfen innerhalb von 24 Stunden höchstens 6 Stunden ausgeführt werden, es sei denn, der Nutzer interagiert mit der App und setzt den Timer zurück.
  3. Starten Sie dataSync- oder mediaProcessing-Dienste im Vordergrund nur als Folge einer direkten Nutzerinteraktion. Da sich Ihre App beim Start des Dienstes im Vordergrund befindet, hat Ihr Dienst die vollen sechs Stunden Zeit, nachdem die App in den Hintergrund gewechselt ist.
  4. Verwende anstelle dieser Dienste im Vordergrund eine alternative API wie WorkManager. Verwenden Sie stattdessen eine alternative API, anstatt einen dataSync-Dienst im Vordergrund.

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 gebracht (wodurch der Timer zurückgesetzt wird). Wenn Sie versuchen, einen anderen dataSync-Dienst im Vordergrund zu starten, gibt das System ForegroundServiceStartNotAllowedException mit einer Fehlermeldung wie „Das Zeitlimit für den Diensttyp dataSync im Vordergrund ist bereits ausgeschöpft“ aus.

Testen

Um das Verhalten deiner App zu testen, kannst du Zeitüberschreitungen für die Datensynchronisierung aktivieren, auch wenn deine App nicht auf Android 15 ausgerichtet ist, solange sie auf einem Android 15-Gerät ausgeführt wird. Führen Sie den folgenden Befehl adb aus, um Zeitüberschreitungen zu aktivieren:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

Sie können auch die Zeitüberschreitung anpassen, um das Verhalten Ihrer App nach Erreichen des Limits leichter 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

Wenn Sie ein neues Zeitlimit für Dienste im Vordergrund von mediaProcessing festlegen möchten, führen Sie diesen Befehl aus:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds