Optimiser les fonctionnalités Sommeil et Mise en veille des applis

Android dispose de deux fonctionnalités d'économie d'énergie qui prolongent l'autonomie de la batterie pour les utilisateurs en gérant le comportement des applications lorsqu'un appareil n'est pas connecté à une source d'alimentation: Sommeil et Mise en veille des applications. Doze réduit la consommation de la batterie en différant l'activité réseau et du processeur en arrière-plan pour les applications lorsque l'appareil n'est pas utilisé pendant de longues périodes. La mise en veille des applications diffère l'activité réseau en arrière-plan pour les applications sans activité utilisateur récente.

Lorsque l'appareil est en mode Sommeil, l'accès des applications à certaines ressources consommant beaucoup de batterie est différé jusqu'à l'intervalle de maintenance. Les restrictions spécifiques sont listées dans Restrictions de gestion de l'alimentation.

Les fonctionnalités Sommeil et Mise en veille des applications gèrent le comportement de toutes les applications exécutées sous Android 6.0 ou version ultérieure, qu'elles ciblent spécifiquement le niveau d'API 23 ou non. Pour garantir la meilleure expérience utilisateur possible, testez votre application en mode Sommeil et Mise en veille des applications, et apportez les ajustements nécessaires à votre code. Les sections suivantes fournissent des détails.

Comprendre la fonctionnalité Sommeil

Si un utilisateur laisse un appareil débranché et à l'arrêt pendant un certain temps, avec l'écran éteint, l'appareil passe en mode Sommeil. En mode Doze, le système tente de préserver la batterie en limitant l'accès des applications aux services réseau et gourmands en processeur. Il empêche également les applications d'accéder au réseau et reporte leurs tâches, synchronisations et alarmes standards.

De manière périodique, le système quitte Doze pendant une courte période pour permettre aux applications de terminer leurs activités différées. Pendant cet intervalle de maintenance, le système exécute toutes les synchronisations, tâches et alarmes en attente, et autorise les applications à accéder au réseau.

Figure 1. La fonctionnalité Sommeil fournit un intervalle de maintenance récurrent permettant aux applications d'utiliser le réseau et de gérer les activités en attente.

Une fois l'intervalle de maintenance terminé, le système passe à nouveau au mode Sommeil, ce qui suspend l'accès au réseau et reporte les tâches, les synchronisations et les alarmes. Au fil du temps, le système planifie les fenêtres de maintenance moins fréquemment, ce qui permet de réduire la consommation de la batterie en cas d'inactivité prolongée lorsque l'appareil n'est pas en charge.

Lorsque l'utilisateur active l'appareil en le déplaçant, en allumant l'écran ou en connectant un chargeur, le système quitte le mode Sommeil et toutes les applications reprennent leur activité normale.

Restrictions de mise en veille

Le système applique les restrictions suivantes à vos applications lorsque vous êtes en mode Sommeil:

Checklist pour le mode Sommeil

Adapter votre application à Doze

La fonctionnalité Sommeil peut affecter les applications différemment, en fonction des fonctionnalités qu'elles offrent et des services qu'elles utilisent. De nombreuses applications fonctionnent normalement au cours des cycles Doze sans modification. Dans certains cas, vous devez optimiser la manière dont votre application gère le réseau, les alarmes, les tâches et les synchronisations. Les applications doivent pouvoir gérer efficacement les activités pendant chaque intervalle de maintenance.

Pour vous aider à planifier des alarmes, vous pouvez utiliser deux méthodes AlarmManager: setAndAllowWhileIdle() et setExactAndAllowWhileIdle(). Ces méthodes vous permettent de définir des alarmes qui se déclenchent même si l'appareil est en mode Sommeil.

La restriction Sommeil sur l'accès réseau est également susceptible d'affecter votre application, en particulier si elle s'appuie sur des messages en temps réel tels que des chatouilles ou des notifications. Si votre application nécessite une connexion persistante au réseau pour recevoir des messages, utilisez si possible Firebase Cloud Messaging (FCM).

Pour vérifier que votre application se comporte comme prévu avec la fonctionnalité Sommeil, vous pouvez utiliser les commandes adb pour forcer le système à activer et à quitter le mode Sommeil, et à observer le comportement de votre application. Pour en savoir plus, consultez Tester avec les fonctionnalités Sommeil et Mise en veille des applications.

Comprendre la mise en veille des applications

La mise en veille des applications permet au système de déterminer qu'une application est inactive lorsque l'utilisateur ne l'utilise pas activement. Le système fait cette détermination lorsque l'utilisateur n'interagit pas avec l'application pendant une certaine période et qu'aucune des conditions suivantes ne s'applique :

  • L'utilisateur lance explicitement l'application.
  • L'application dispose d'un processus actuellement au premier plan, soit en tant que service d'activité ou de premier plan, soit en cours d'utilisation par une autre activité ou un autre service de premier plan.
  • L'application génère une notification que les utilisateurs voient sur l'écran de verrouillage ou dans la barre des notifications.

Lorsque l'utilisateur branche l'appareil sur une alimentation, le système libère les applications de l'état de veille, ce qui leur permet d'accéder librement au réseau et d'exécuter les tâches et synchronisations en attente. Si l'appareil est inactif pendant de longues périodes, le système autorise les applications inactives à accéder au réseau environ une fois par jour.

Utiliser FCM pour interagir avec votre application lorsque l'appareil est inactif

Firebase Cloud Messaging (FCM) est un service cloud-to-device qui vous permet de prendre en charge la messagerie en aval en temps réel entre les services backend et les applications sur les appareils Android. FCM fournit une connexion unique et persistante au cloud. Toutes les applications nécessitant la messagerie en temps réel peuvent partager cette connexion. Cette connexion partagée optimise considérablement l'utilisation de la batterie, car plusieurs applications n'ont plus à gérer leurs propres connexions persistantes distinctes, ce qui peut rapidement épuiser la batterie. Pour cette raison, si votre application nécessite l'intégration de la messagerie à un service de backend, nous vous recommandons vivement d'utiliser FCM dans la mesure du possible, plutôt que de conserver votre propre connexion réseau persistante.

FCM est optimisé pour fonctionner avec les modes d'inactivité Sommeil et Mise en veille des applications. Les messages à priorité élevée de FCM vous permettent de réactiver votre application pour engager l'utilisateur. En mode Doze ou Mise en veille des applications, le système envoie le message et accorde à l'application un accès temporaire aux services réseau et aux wakelocks partiels, puis rétablit l'état inactif de l'appareil ou de l'application. Pour les notifications urgentes et visibles par l'utilisateur, envisagez d'utiliser des messages à priorité élevée pour activer la distribution en mode Sommeil. Les messages à priorité élevée peuvent entraîner l'envoi de notifications. Pour en savoir plus, consultez les consignes de FCM sur les messages à priorité élevée.

Pour les messages qui ne génèrent pas de notifications, tels que la mise à jour en arrière-plan du contenu de l'application ou le lancement de synchronisations de données, utilisez des messages FCM de priorité normale. Les messages de priorité normale sont distribués immédiatement si l'appareil n'est pas en mode Sommeil. Si l'appareil est en mode Doze, elles sont envoyées pendant les intervalles de maintenance périodiques de Doze ou dès que l'utilisateur active l'appareil.

En règle générale, si votre application nécessite des messages en aval, utilisez FCM. Si votre application utilise déjà FCM, assurez-vous qu'elle n'utilise des messages à priorité élevée que pour les messages qui génèrent des notifications destinées aux utilisateurs.

Autres cas d'utilisation

Presque toutes les applications peuvent prendre en charge le mode Doze en gérant la connectivité réseau, les alarmes, les tâches et les synchronisations, et en utilisant des messages FCM. Pour un ensemble restreint de cas d'utilisation, cela peut s'avérer insuffisant. Dans ce cas, le système fournit une liste configurable d'applications partiellement exemptées des optimisations de Sommeil et de Mise en veille des applications.

Une application partiellement exemptée peut utiliser le réseau et maintenir des wakelocks partiels pendant les périodes Sommeil et Mise en veille des applications. Toutefois, d'autres restrictions s'appliquent toujours à l'application, comme aux autres applications. Par exemple, les tâches et les synchronisations de l'application sont différées au niveau d'API 23 et versions antérieures, et ses alarmes AlarmManager régulières ne se déclenchent pas. Une application peut vérifier si elle figure sur la liste des exceptions en appelant isIgnoringBatteryOptimizations().

Les utilisateurs peuvent configurer manuellement la liste des applications exemptées dans Paramètres > Batterie > Optimisation de la batterie. Le système permet également aux applications de demander aux utilisateurs de les exempter :

Une application peut vérifier si elle figure actuellement sur la liste des exceptions en appelant isIgnoringBatteryOptimizations().

Tester avec les fonctionnalités Sommeil et Mise en veille des applications

Pour garantir une expérience optimale à vos utilisateurs, testez entièrement votre application en mode Sommeil et Mise en veille des applications.

Tester votre application avec le mode Sommeil

Vous pouvez tester le mode Sommeil en procédant comme suit:

  1. Configurez un appareil physique ou virtuel avec une image système Android 6.0 (niveau d'API 23) ou ultérieure.
  2. Connectez l'appareil à votre ordinateur de développement et installez votre application.
  3. Exécutez votre application et laissez-la active.
  4. Forcez le système en mode veille en exécutant la commande suivante :
        $ adb shell dumpsys deviceidle force-idle
        
  5. Lorsque vous êtes prêt, quittez le mode veille en exécutant la commande suivante :
        $ adb shell dumpsys deviceidle unforce
        
  6. Réactivez l'appareil en exécutant la commande suivante :
        $ adb shell dumpsys battery reset
        
  7. Observez le comportement de votre application une fois l'appareil réactivé. Assurez-vous que l'application se rétablit correctement lorsque l'appareil quitte le mode Sommeil.

Tester votre application avec App Standby

Pour tester le mode Mise en veille des applications avec votre application, procédez comme suit:

  1. Configurez un appareil matériel ou virtuel avec une image système Android 6.0 (niveau d'API 23) ou version ultérieure.
  2. Connectez l'appareil à votre ordinateur de développement et installez votre application.
  3. Exécutez votre application et laissez-la active.
  4. Forcez l'application à passer en mode veille en exécutant les commandes suivantes :
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Simulez l'activation de votre application à l'aide des commandes suivantes :
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. Observez le comportement de votre application après son activation. Assurez-vous que l'application se rétablit correctement à partir du mode veille. Vérifiez en particulier si les notifications et les tâches en arrière-plan de votre application fonctionnent comme prévu.

Cas d'utilisation autorisée pour l'exemption

Le tableau suivant présente plusieurs cas d'utilisation et indique si les applications peuvent utiliser l'action d'intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS dans ces situations. En général, votre application ne répond pas à ces exceptions, sauf si Doze ou le mode Veille de l'application interrompt la fonction de base de l'application ou s'il existe une raison technique pour laquelle votre application ne peut pas utiliser les messages FCM à priorité élevée.

Pour en savoir plus, consultez la section Assistance pour d'autres cas d'utilisation.

Type Cas d'utilisation Peut utiliser FCM ? Exception acceptable ? Notes
Application de messagerie instantanée, de chat ou d'appel Nécessite l'envoi de messages en temps réel aux utilisateurs lorsque l'appareil est en mode Sommeil ou que l'application est en mode Mise en veille des applications. Oui, avec FCM Non acceptable Utiliser des messages FCM à priorité élevée pour activer l'application et accéder au réseau.
Oui, mais n'utilise pas les messages FCM à priorité élevée.
Application de messagerie instantanée, de chat ou d'appel ; applications VoIP d'entreprise Non, vous ne pouvez pas utiliser FCM en raison d'une dépendance technique envers un autre service de messagerie ou parce que Doze et App Standby perturbent la fonction de base de l'application. Acceptable
Sécurité. Des applications qui protègent leurs utilisateurs et leur famille À renseigner le cas échéant. Acceptable
Application d'automatisation des tâches La fonction de base de l'application consiste à planifier des actions automatisées, telles que la messagerie instantanée, les appels vocaux ou la nouvelle gestion des photos. À renseigner le cas échéant. Acceptable
Application associée à un périphérique La fonction de base de l'application consiste à maintenir une connexion persistante avec le périphérique afin de lui fournir un accès à Internet. À renseigner le cas échéant. Acceptable
L'application n'a besoin de se connecter à un périphérique que régulièrement pour se synchroniser, ou n'a besoin de se connecter qu'à des appareils, tels qu'un casque sans fil, connectés via des profils Bluetooth standards. À renseigner le cas échéant. Non autorisé