Si une application cible Android 15 ou une version ultérieure, le système impose des restrictions sur la durée pendant laquelle certains services de premier plan sont autorisés à s'exécuter lorsque votre application est en arrière-plan. Actuellement, cette restriction ne s'applique qu'aux
dataSync et
mediaProcessing de type service de premier plan services de premier plan. Des limites plus restrictives s'appliquent au type de service de premier plan shortService
qui sont abordées dans la documentation de ce type de service.
Comportement en cas de délai avant expiration
Le système autorise les services de premier plan dataSync et mediaProcessing à s'exécuter
pendant un total de six heures sur une période de 24 heures, après quoi il appelle la méthode Service.onTimeout(int, int) du service en cours d'exécution
(introduite dans Android 15). (Le type de service de premier plan mediaProcessing a été ajouté dans Android 15.) La limite de six heures est suivie séparément pour les services dataSync et mediaProcessing. Par exemple, si un service dataSync vient de s'exécuter pendant une heure, l'application ne disposera que de cinq heures pour les services de premier plan dataSync, mais de six heures complètes pour les services mediaProcessing.
Lorsqu'un service de premier plan atteint la limite de six heures, il dispose de quelques
secondes pour appeler Service.stopSelf(). Lorsque le système appelle Service.onTimeout(), le service n'est plus considéré comme un service de premier plan.
Si le service n'appelle pas Service.stopSelf(), le système génère une exception interne. L'exception est enregistrée dans Logcat avec le message suivant :
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
Pour éviter les problèmes liés à ce changement de comportement, vous pouvez effectuer une ou plusieurs des opérations suivantes :
- Demandez à votre service d'implémenter la nouvelle méthode
Service.onTimeout(int, int). Lorsque votre application reçoit le rappel, veillez à appelerstopSelf()dans les secondes qui suivent. (Si vous n'arrêtez pas l'application immédiatement, le système génère un échec.) - Assurez-vous que les services
dataSyncetmediaProcessingde votre application ne s'exécutent pas pendant plus de six heures au total sur une période de 24 heures (sauf si l'utilisateur interagit avec l'application, ce qui réinitialise le minuteur). - Ne démarrez les services de premier plan
dataSyncoumediaProcessingqu'à la suite d'une interaction directe de l'utilisateur. Étant donné que votre application est au premier plan lorsque le service démarre, votre service dispose des six heures complètes une fois que l'application passe en arrière-plan. - Au lieu d'utiliser ces services de premier plan, utilisez une alternative
API, comme WorkManager. En particulier, au lieu d'utiliser un
dataSyncservice de premier plan, envisagez d'utiliser une API alternative.
Si les services de premier plan dataSync de votre application se sont exécutés pendant six heures au cours des dernières
24 heures, vous ne pouvez pas démarrer un autre service de premier plan dataSync sauf si l'utilisateur
a mis votre application au premier plan (ce qui réinitialise le minuteur). Si vous essayez de
démarrer un autre service de premier plan dataSync, le système génère
ForegroundServiceStartNotAllowedException
avec un message d'erreur tel que "Time limit already exhausted for foreground service
type dataSync" (Limite de temps déjà dépassée pour le type de service de premier plan dataSync).
Tests
Pour tester le comportement de votre application, vous pouvez activer les délais avant expiration de la synchronisation des données, même si votre application ne cible pas Android 15 (à condition qu'elle s'exécute sur un appareil Android 15). Pour activer les délais avant expiration, exécutez la commande adb suivante :
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Vous pouvez également ajuster le délai avant expiration pour faciliter le test du comportement de votre application lorsque la limite est atteinte. Pour définir un nouveau délai avant expiration pour les services de premier plan dataSync, exécutez la commande adb suivante :
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
Pour définir un nouveau délai avant expiration pour les services de premier plan mediaProcessing, exécutez la commande suivante :
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds