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
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:
- Implementieren Sie in Ihrem Dienst die neue
Service.onTimeout(int, int)
-Methode. Wenn Ihre App den Callback empfängt, müssen Sie innerhalb weniger SekundenstopSelf()
anrufen. Wenn Sie die App nicht sofort beenden, generiert das System einen Fehler. - Die
dataSync
- undmediaProcessing
-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. - Starten Sie
dataSync
- odermediaProcessing
-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. - Verwenden Sie stattdessen eine alternative API wie WorkManager. Anstatt einen
dataSync
-Dienst im Vordergrund zu verwenden, sollten Sie stattdessen eine alternative API verwenden.
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 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. Wenn Sie ein neues Zeitlimit für Dienste im Vordergrund von dataSync
festlegen möchten, führen Sie den folgenden adb
-Befehl aus:
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