Délais avant expiration des services de premier plan

Si une application cible Android 15 ou une version ultérieure, le système limite 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 services de premier plan dataSync et mediaProcessing de type service de premier plan. Il existe des limites plus restrictives pour le type de service de premier plan shortService, qui sont décrites dans la documentation correspondante.

Comportement du 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 le système 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.) Le délai de six heures est suivi 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 dispose que de cinq heures pour les services de premier plan mediaProcessing, mais de six heures complètes pour les services dataSync.

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 l'une ou plusieurs des opérations suivantes:

  1. Demandez à votre service d'implémenter la nouvelle méthode Service.onTimeout(int, int). Lorsque votre application reçoit le rappel, veillez à appeler stopSelf() dans un délai de quelques secondes. (Si vous n'arrêtez pas l'application immédiatement, le système génère une défaillance.)
  2. Assurez-vous que les services dataSync et mediaProcessing de 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).
  3. Ne démarrez les services de premier plan dataSync ou mediaProcessing qu'en raison d'une interaction directe avec l'utilisateur. Étant donné que votre application est au premier plan au démarrage du service, votre service dispose de six heures complètes après que l'application est passée en arrière-plan.
  4. Au lieu d'utiliser ces services de premier plan, utilisez une API alternative, comme WorkManager. En particulier, au lieu d'utiliser un service de premier plan dataSync, envisagez d'utiliser une API alternative.

Si les services de premier plan dataSync de votre application ont été 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 une erreur ForegroundServiceStartNotAllowedException avec un message d'erreur du type "Time limit already expired for premier service type dataSync" (La limite de temps est déjà épuisé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 la période de délai avant expiration pour tester plus facilement le 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 cette commande:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds