Optimiser l'utilisation de la batterie pour les API de planification des tâches

Cette page suggère quelques bonnes pratiques pour configurer des tâches en arrière-plan bien commises. Ces bonnes pratiques visent spécifiquement à réduire la consommation de la batterie, mais elles peuvent également améliorer les performances de l'appareil par d'autres moyens, par exemple en réduisant l'utilisation du réseau.

Choisir des contraintes optimales et combiner des tâches

Pour minimiser la charge que vos tâches imposent sur l'appareil, il est important de spécifier des contraintes optimales. (Pour les tâches JobScheduler, consultez JobInfo.Builder pour obtenir la liste des contraintes.) Par exemple, si vous souhaitez vous assurer que votre application n'épuise pas la batterie, nous vous recommandons de spécifier la contrainte RequiresCharging. Cette contrainte indique au système de ne pas exécuter la tâche, sauf si le niveau de la batterie augmente. De même, l'utilisation du Wi-Fi nécessite généralement moins d'énergie que les données mobiles. Par conséquent, si votre tâche nécessite une connexion réseau, mais qu'elle peut attendre qu'un réseau sans compteur soit disponible, nous vous recommandons de définir une contrainte NetworkType.UNMETERED.

De plus, si plusieurs tâches similaires relèvent des mêmes contraintes, il est généralement judicieux de les combiner en une seule tâche afin que l'appareil ne soit activé qu'une seule fois. Par exemple, supposons que votre application dispose de trois ensembles de données différents dont elle a besoin pour la synchroniser avec Cloud Storage. Au lieu de planifier trois tâches différentes (une pour chaque ensemble de données), il est généralement préférable de planifier une seule tâche de synchronisation des données, de définir les contraintes appropriées et de laisser cette tâche effectuer toutes les synchronisations de données en attente lors de son exécution.

Cela dit, vous ne devez pas essayer de combiner des tâches non liées en une seule tâche. Assurez-vous plutôt de définir des contraintes appropriées pour chaque tâche. Par exemple, si les tâches sont de faible priorité, veillez à spécifier qu'elles doivent s'exécuter lorsque l'appareil est inactif et en charge. Ainsi, même si l'appareil est activé plusieurs fois, cela ne nuit pas à l'expérience utilisateur ni n'affecte l'autonomie de la batterie.

Marquer des tâches comme accélérées uniquement lorsqu'elles sont urgentes

Si une tâche est particulièrement urgente, vous pouvez la marquer comme accélérée. (Pour les tâches JobScheduler, appelez JobInfo.Builder.setExpedited(true).) Vous pouvez ainsi hiérarchiser la tâche de différentes manières. Par exemple, le système exécute ces tâches immédiatement lorsqu'il le peut, et les restrictions de gestion de l'alimentation sont moins susceptibles d'affecter les tâches accélérées.

C'est pourquoi vous devez veiller à marquer une tâche comme accélérée uniquement lorsque vous en avez besoin. Étant donné que les tâches accélérées peuvent ignorer certaines gains d'efficacité du système, elles peuvent consommer plus d'énergie que si elles n'étaient pas marquées de cette manière.

Vous ne devez marquer une tâche comme accélérée que si elle est urgente, et l'expérience utilisateur serait altérée si l'exécution de la tâche prendrait plus de temps. Par exemple, si votre application exécute une tâche pour gérer un message FCM à priorité élevée, marquez cette tâche comme accélérée. Toutefois, vous ne devez pas marquer une tâche comme accélérée uniquement pour remplacer les optimisations système.

Vérifier pourquoi vos tâches ont été arrêtées

Si vos tâches s'arrêtent avant qu'elles ne soient terminées, vous pouvez en vérifier la raison en appelant WorkInfo.getStopReason(). (Pour les tâches JobScheduler, appelez JobParameters.getStopReason(). Il est important de procéder ainsi pour plusieurs raisons. Tout d'abord, vous voulez bien sûr terminer vos tâches. Découvrir pourquoi vos tâches se sont arrêtées vous aide à éviter des situations similaires. Toutefois, le système est également susceptible d'arrêter des tâches en raison d'un comportement qui surutilise les ressources système. Votre application ne doit pas être un mauvais citoyen et utiliser inutilement la batterie ou le réseau.

Par exemple, si vos tâches sont fréquemment arrêtées pour le motif STOP_REASON_TIMEOUT, il peut arriver qu'un cas limite prenne plus de temps que prévu.

Nous vous recommandons d'utiliser votre moteur d'analyse pour savoir si les tâches de votre application sont arrêtées, et pour quelles raisons.