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 Ihre App im Hintergrund befindet. Derzeit gilt diese Einschränkung nur für Dienste im Vordergrund vom Typ dataSync
und mediaProcessing
. Für den shortService
-Diensttyp im Vordergrund gelten restriktivere Grenzwerte, die in der Dokumentation zu diesem Diensttyp beschrieben werden.
Verhalten bei Zeitüberschreitung
Das System erlaubt, dass dataSync
- und mediaProcessing
-Dienste im Vordergrund in einem Zeitraum von 24 Stunden insgesamt 6 Stunden lang ausgeführt werden. Danach ruft das System die Service.onTimeout(int, int)
-Methode des ausgeführten Dienstes auf (eingeführt in Android 15). Der Diensttyp mediaProcessing
im Vordergrund wurde in Android 15 hinzugefügt. Das Zeitlimit 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 sechs Stunden für mediaProcessing
-Dienste.
Wenn ein Vordergrunddienst das Sechs-Stunden-Limit 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, 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 können Sie Probleme mit dieser Verhaltensänderung vermeiden:
- Lassen Sie in Ihrem Dienst die neue Methode
Service.onTimeout(int, int)
implementieren. Wenn Ihre App den Callback empfängt, rufen SiestopSelf()
innerhalb weniger Sekunden auf. Wenn Sie die App nicht sofort beenden, generiert das System einen Fehler. - Achte darauf, dass die Dienste
dataSync
undmediaProcessing
deiner App in einem beliebigen 24-Stunden-Zeitraum 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 Ergebnis einer direkten Nutzerinteraktion. Da sich Ihre App beim Start des Dienstes im Vordergrund befindet, hat Ihr Dienst die vollen sechs Stunden nach dem Wechsel der App in den Hintergrund. - Verwenden Sie stattdessen eine alternative API wie WorkManager. Anstelle eines
dataSync
-Diensts im Vordergrund sollten Sie eine alternative API verwenden.
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 geholt (wodurch der Timer zurückgesetzt wird). Wenn Sie versuchen, einen weiteren dataSync
-Vordergrunddienst zu starten, löst das System ForegroundServiceStartNotAllowedException
mit einer Fehlermeldung wie „Das Zeitlimit für den Vordergrunddiensttyp ‚dataSync‘ wurde bereits überschritten“ aus.
Testen
Um das Verhalten Ihrer App zu testen, 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 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 den Zeitüberschreitungszeitraum anpassen, um leichter zu testen, wie sich Ihre App verhält, wenn das Limit erreicht ist. Wenn Sie ein neues Zeitlimit für dataSync
-Vordergrunddienste 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
Führen Sie diesen Befehl aus, um ein neues Zeitlimit für mediaProcessing
-Vordergrunddienste festzulegen:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds