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 erlaubt dataSync- und mediaProcessing-Dienste im Vordergrund, innerhalb eines Zeitraums von 24 Stunden insgesamt 6 Stunden lang ausgeführt zu werden. Danach ruft das System die Methode Service.onTimeout(int, int) des laufenden Dienstes auf (in Android 15 eingeführt). Der Diensttyp mediaProcessing für Dienste im Vordergrund 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 deine App den Callback empfängt, musst du stopSelf() innerhalb weniger Sekunden aufrufen. Wenn Sie die Anwendung nicht sofort beenden, tritt ein Fehler auf.
  2. Die dataSync- und mediaProcessing-Dienste Ihrer App dürfen innerhalb eines 24-Stunden-Zeitraums nicht länger als insgesamt 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 aufgrund 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 verschoben wurde.
  4. Verwenden Sie stattdessen 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 6 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 weiteren dataSync-Vordergrunddienst zu starten, gibt das System ForegroundServiceStartNotAllowedException mit einer Fehlermeldung zurück, z. B. „Zeitlimit für den Typ ‚dataSync‘ des Vordergrunddienstes bereits überschritten“.

Testen

Sie können Zeitüberschreitungen für die Datensynchronisierung aktivieren, um das Verhalten Ihrer App zu testen, 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 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