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. La fonctionnalité Sommeil réduit l'utilisation de la batterie en différant l'activité du processeur et du réseau en arrière-plan pour les applications lorsque l'appareil n'est pas utilisé pendant de longues périodes. App Standby reporte l'activité réseau en arrière-plan pour les applications sans activité récente de l'utilisateur.

Lorsque l'appareil est en mode Sommeil, l'accès des applications à certaines ressources qui consomment beaucoup de batterie est reporté 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 sur Android 6.0 ou version ultérieure, qu'elles ciblent ou non le niveau d'API 23. Pour garantir la meilleure expérience utilisateur, 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 immobile pendant un certain temps et que l'écran est éteint, l'appareil passe en mode Sommeil. En mode Sommeil, le système tente de préserver la batterie en limitant l'accès des applications aux services nécessitant une utilisation intensive du réseau et du processeur. Il empêche également les applications d'accéder au réseau et diffère leurs tâches, synchronisations et alarmes standards.

À intervalles réguliers, le système quitte le mode Sommeil pendant un court laps de temps pour permettre aux applications de terminer leurs activités différées. Au cours de 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 aux applications pour leur permettre d'utiliser le réseau et de gérer les activités en attente.

À la fin de l'intervalle de maintenance, le système passe de nouveau en mode Sommeil, suspendant l'accès au réseau et différant les tâches, les synchronisations et les alarmes. Au fil du temps, le système planifie les intervalles de maintenance moins fréquemment, contribuant ainsi à réduire la consommation de la batterie en cas d'inactivité plus longue 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 une activité normale.

Restrictions de sommeil

Lorsque le système est en mode Sommeil, le système applique les restrictions suivantes à vos applis:

Checklist pour Sommeil

Adapter votre application au mode Sommeil

La fonctionnalité Sommeil peut affecter les applications différemment, en fonction de leurs fonctionnalités et des services qu'elles utilisent. De nombreuses applications fonctionnent normalement pendant les cycles de sommeil 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 à chaque intervalle de maintenance.

Pour faciliter la programmation 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 celle-ci repose sur des messages en temps réel tels que des tickles 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 à ouvrir et quitter la fonctionnalité 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 prend cette décision lorsque l'utilisateur ne touche pas l'application pendant un certain temps 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 qu'activité ou service de premier plan, soit en cours d'utilisation par une autre activité ou un service de premier plan.
  • L'application génère une notification que les utilisateurs voient sur l'écran de verrouillage ou dans la barre de notification.

Lorsque l'utilisateur branche l'appareil à 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 les 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 d'assurer la messagerie en aval en temps réel entre les services de backend et les applications sur les appareils Android. FCM fournit une connexion unique et persistante au cloud. Toutes les applications ayant besoin de 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 pas besoin de maintenir leurs propres connexions persistantes distinctes, ce qui peut épuiser rapidement la batterie. Pour cette raison, si votre application nécessite une intégration de messagerie avec un service de backend, nous vous recommandons vivement d'utiliser FCM si possible, plutôt que de maintenir votre propre connexion réseau persistante.

FCM est optimisé pour fonctionner avec les modes Sommeil et Mise en veille des applications. Les messages FCM à priorité élevée vous permettent d'activer votre application pour engager l'utilisateur. En mode Sommeil ou Mise en veille des applications, le système transmet le message et donne à 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 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 des notifications. Pour plus d'informations, consultez les conseils de FCM sur les messages à priorité élevée.

Pour les messages qui n'entraînent pas de notifications, par exemple pour maintenir le contenu de l'application à jour en arrière-plan ou lancer des synchronisations de données, utilisez les messages FCM de priorité normale. Les messages à priorité normale sont distribués immédiatement si l'appareil n'est pas en mode Sommeil. Si l'appareil est en mode Sommeil, elles sont envoyées pendant les intervalles de maintenance Sommeil périodiques ou dès que l'utilisateur active l'appareil.

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

Compatibilité avec d'autres cas d'utilisation

Presque toutes les applications sont compatibles avec la fonctionnalité Sommeil en gérant la connectivité réseau, les alarmes, les tâches et les synchronisations, ainsi qu'en utilisant les messages FCM. Pour un ensemble restreint de cas d'utilisation, cela peut être insuffisant. Dans ce cas, le système fournit une liste configurable d'applications qui sont partiellement exemptées des optimisations des fonctionnalités Sommeil et Mise en veille des applications.

Une application partiellement exemptée peut utiliser le réseau et maintenir des wakelocks partiels pendant les fonctionnalités Sommeil et Mise en veille des applications. Toutefois, d'autres restrictions s'appliquent toujours à l'application, comme c'est le cas pour d'autres applications. Par exemple, les tâches et les synchronisations de l'application sont différées à partir du niveau d'API 23, et ses alarmes AlarmManager standards ne se déclenchent pas. Une application peut vérifier si elle figure actuellement 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 dans les modes Sommeil et Mise en veille des applications.

Tester votre application avec la fonctionnalité Sommeil

Pour tester le mode Sommeil, procédez comme suit:

  1. Configurez un appareil matériel ou un appareil 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 le système à passer en mode inactif en exécutant la commande suivante :
        $ adb shell dumpsys deviceidle force-idle
        
  5. Lorsque vous êtes prêt, quittez le mode inactif 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 après avoir réactivé l'appareil. Assurez-vous que l'application se rétablit correctement lorsque l'appareil quitte la fonctionnalité 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 un appareil 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 Mise en veille des applications 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 l'avoir réactivée. Assurez-vous que l'application récupère correctement le 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 met en évidence plusieurs cas d'utilisation et indique s'il est acceptable que les applications utilisent 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 les fonctionnalités Sommeil ou Mise en veille des applications n'interrompent pas la fonction principale de l'application ou qu'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 Compatibilité avec d'autres cas d'utilisation.

Type Cas d'utilisation Utilisation de FCM possible Exonération acceptable ? Notes
Application de messagerie instantanée, de chat ou d'appel Nécessite la distribution de messages en temps réel aux utilisateurs lorsque l'appareil est en mode Sommeil ou que l'application est en veille des applications. Oui, avec FCM Non accepté Utilisez les 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 professionnelles. Non, vous ne pouvez pas utiliser FCM en raison d'une dépendance technique à un autre service de messagerie, ou les fonctionnalités Sommeil et Mise en veille des applications interrompent la fonction principale de l'application. Acceptable
Sécurité. Des applications qui protègent leurs utilisateurs et leur famille. (le cas échéant) Acceptable
Application d'automatisation des tâches La fonction principale de l'application est la planification d'actions automatisées, comme la messagerie instantanée, les appels vocaux ou la gestion de nouvelles photos. (le cas échéant) Acceptable
Application associée au périphérique La fonction principale de l'application consiste à maintenir une connexion persistante avec le périphérique afin de lui fournir un accès Internet. (le cas échéant) Acceptable
L'application n'a besoin de se connecter à un périphérique qu'à intervalles réguliers pour la synchronisation, ou uniquement à des appareils connectés via des profils Bluetooth standards, tels qu'un casque sans fil. (le cas échéant) Non accepté