Android dispose de deux fonctionnalités d'économie d'énergie qui prolongent l'autonomie de la batterie en gérant le comportement des applications lorsqu'un appareil n'est pas connecté à une source d'alimentation : le mode Sommeil et la mise en veille des applications. Le mode Doze réduit la consommation de la batterie en différant l'activité du processeur et l'activité réseau 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é de l'utilisateur récente.
Lorsque l'appareil est en mode Sommeil, l'accès des applications à certaines ressources gourmandes en batterie est différé jusqu'à l'intervalle de maintenance. Les restrictions spécifiques sont listées dans Restrictions de gestion de l'alimentation.
Doze et la 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 spécifiquement le niveau d'API 23 ou non. Pour offrir une expérience optimale aux utilisateurs, testez votre application en mode Sommeil et en mode Mise en veille des applications, et apportez les ajustements nécessaires à votre code. Vous trouverez des informations détaillées dans les sections suivantes.
Comprendre le mode Sommeil
Si un utilisateur laisse un appareil débranché et immobile pendant un certain temps, avec l'écran éteint, l'appareil passe en mode Sommeil. En mode Sommeil, le système tente d'économiser la batterie en limitant l'accès des applications aux services réseau et aux services gourmands en ressources du processeur. Il empêche également les applications d'accéder au réseau et reporte leurs jobs, synchronisations et alarmes standards.
Régulièrement, le système quitte le mode Doze pendant un court instant 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 permet aux applications d'accéder au réseau.
Une fois l'intervalle de maintenance terminé, le système repasse en 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 moins fréquemment les intervalles de maintenance, 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 réactive l'appareil en le déplaçant, en allumant l'écran ou en connectant un chargeur, le système quitte le mode Doze et toutes les applications reprennent leur activité normale.
Restrictions du mode Doze
Le système applique les restrictions suivantes à vos applications en mode Doze :
- Suspend l'accès au réseau.
- Ignore les wakelocks.
- Reporte les alarmes
AlarmManagerstandards, y comprissetExact()etsetWindow(), au prochain intervalle de maintenance.- Si vous devez définir des alarmes qui se déclenchent en mode Sommeil, utilisez
setAndAllowWhileIdle()ousetExactAndAllowWhileIdle(). - Les alarmes définies avec
setAlarmClock()continuent de se déclencher normalement. Le système quitte le mode Sommeil peu de temps avant le déclenchement de ces alarmes.
- Si vous devez définir des alarmes qui se déclenchent en mode Sommeil, utilisez
- N'effectue pas de recherches Wi-Fi.
- Empêche l'exécution des adaptateurs de synchronisation.
- Empêche l'exécution de
JobScheduler.
Checklist pour le mode Sommeil
- Si possible, utilisez Firebase Cloud Messaging (FCM) pour la messagerie en aval.
- Si vos utilisateurs doivent voir une notification immédiatement, utilisez le type de message
RemoteNotification. Pour en savoir plus, consultez la documentation de FCM sur le type de messageRemoteNotification. - Fournissez suffisamment d'informations dans la charge utile du message initial pour que l'accès ultérieur au réseau ne soit pas nécessaire.
- Définissez des alarmes critiques avec
setAndAllowWhileIdle()etsetExactAndAllowWhileIdle(). - Testez votre application en mode Sommeil.
Adapter votre application au mode Sommeil
Le mode Doze peut affecter les applications différemment, en fonction des fonctionnalités qu'elles proposent et des services qu'elles utilisent. De nombreuses applications fonctionnent normalement pendant les cycles du mode Doze sans modification. Dans certains cas, vous devez optimiser la façon dont votre application gère le réseau, les alarmes, les jobs et les synchronisations. Les applications doivent pouvoir gérer efficacement les activités pendant chaque intervalle de maintenance.
Pour vous aider à programmer 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 du mode Doze sur l'accès au réseau est également susceptible d'affecter votre application, en particulier si elle repose sur des messages en temps réel tels que des notifications. Si votre application nécessite une connexion persistante au réseau pour recevoir des messages, utilisez Firebase Cloud Messaging (FCM) si possible.
Pour vérifier que votre application se comporte comme prévu avec le mode Doze, vous pouvez utiliser les commandes adb pour forcer le système à entrer et sortir du mode Doze, et observer le comportement de votre application. Pour en savoir plus, consultez Tester avec la fonctionnalité Sommeil et la 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 n'interagit pas avec 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 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 de notification.
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 de backend et les applications sur les appareils Android. FCM fournit une connexion unique et persistante au cloud. Toutes les applications nécessitant une messagerie en temps réel peuvent partager cette connexion. Cette connexion partagée optimise considérablement la consommation de la batterie en évitant que plusieurs applications ne maintiennent leurs propres connexions persistantes distinctes, ce qui peut épuiser rapidement la batterie. C'est pourquoi, si votre application nécessite l'intégration de la messagerie à 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 inactifs Sommeil et Mise en veille des applications. Le type de message FCM RemoteNotification vous permet de réactiver votre application pour susciter l'engagement de l'utilisateur. En mode Doze 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 remet l'appareil ou l'application à l'état inactif. Pour les notifications urgentes visibles par l'utilisateur, envisagez d'utiliser les types de messages RemoteNotification pour permettre la distribution en mode Sommeil. Ces messages peuvent générer des notifications. Pour en savoir plus, consultez les
conseils de FCM sur RemoteNotification.
Pour les messages qui ne génèrent pas de notifications, comme la mise à jour du contenu de l'application en arrière-plan ou le lancement de synchronisations de données, utilisez les messages FCM BackgroundSync. Ces messages sont intentionnellement de faible priorité et peuvent être retardés ou limités pour optimiser la batterie de l'appareil.
En règle 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 utilise RemoteNotification pour les messages qui entraînent des notifications visibles par l'utilisateur.
N'utilisez pas RemoteNotification dans les situations suivantes :
- Lorsqu'une notification ne sera définitivement pas affichée.
- Pour la distribution immédiate de messages qui ne font que mettre à jour l'état de l'application, par exemple pour maintenir le contenu de l'application à jour en arrière-plan ou lancer des synchronisations de données.
- Comme moyen d'inviter l'utilisateur final à accorder des autorisations.
Prise en charge d'autres cas d'utilisation
Presque toutes les applications sont compatibles avec le mode Sommeil, car elles gèrent la connectivité réseau, les alarmes, les jobs et les synchronisations, et utilisent les 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 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 conserver des wakelocks partiels pendant les modes Sommeil et Mise en veille des applications. Toutefois, d'autres restrictions s'appliquent toujours à l'application, comme pour les autres applications. Par exemple, les jobs et les synchronisations de l'application sont différés sur le niveau d'API 23 et les niveaux inférieurs, et ses alarmes AlarmManager standards ne se déclenchent pas. Une application peut vérifier si elle figure actuellement sur la liste d'exemptions 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 :
- La plupart des applications peuvent appeler un intent contenant
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS. - Les applications qui répondent à un cas d'utilisation acceptable peuvent appeler un intent contenant l'action d'intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSpour permettre à l'utilisateur d'ajouter l'application directement à la liste d'exceptions, sans accéder aux paramètres système.
Une application peut vérifier si elle figure actuellement sur la liste d'exemptions en appelant isIgnoringBatteryOptimizations().
Tester avec la fonctionnalité Sommeil et la mise en veille des applications
Pour garantir une expérience optimale à vos utilisateurs, testez entièrement votre application avec les fonctionnalités Sommeil et Mise en veille des applications.
Tester votre application avec le mode Doze
Pour tester le mode Doze, procédez comme suit :
- Configurez un appareil physique ou virtuel avec une image système Android 6.0 (niveau d'API 23) ou version ultérieure.
- Connectez l'appareil à votre ordinateur de développement et installez votre application.
- Exécutez votre application et laissez-la active.
- Forcez le système à passer en mode inactif en exécutant la commande suivante :
$ adb shell dumpsys deviceidle force-idle - Lorsque vous êtes prêt, quittez le mode inactif en exécutant la commande suivante :
$ adb shell dumpsys deviceidle unforce - Réactivez l'appareil en exécutant la commande suivante :
$ adb shell dumpsys battery reset - 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 le mode Sommeil.
Tester votre application avec la mise en veille des applications
Pour tester le mode Mise en veille des applications avec votre application, procédez comme suit :
- Configurez un appareil physique ou virtuel avec une image système Android 6.0 (niveau d'API 23) ou version ultérieure.
- Connectez l'appareil à votre ordinateur de développement et installez votre application.
- Exécutez votre application et laissez-la active.
- 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 - Simulez le réveil de votre application à l'aide des commandes suivantes :
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName> - Observez le comportement de votre application après l'avoir réactivée. Assurez-vous que l'application se rétablit correctement après le mode veille. En particulier, vérifiez si les notifications et les tâches en arrière-plan de votre application fonctionnent comme prévu.
Cas d'utilisation acceptables pour l'exemption
Le tableau suivant présente 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 le mode Doze ou la mise en veille des applications interrompent la fonction principale de l'application, ou s'il existe une raison technique pour laquelle votre application ne peut pas utiliser les messages FCM RemoteNotification.
Pour en savoir plus, consultez Compatibilité avec d'autres cas d'utilisation.
| Type | Cas d'utilisation | Peut utiliser FCM ? | Exemption acceptable ? | Remarques |
|---|---|---|---|---|
| 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 accepté | Utilisez les messages FCM RemoteNotification pour réactiver l'application et accéder au réseau. |
Oui, mais n'utilise pas les messages FCM RemoteNotification. |
||||
| Application de messagerie instantanée, de chat ou d'appel ; applications VoIP d'entreprise. | Non, je ne peux pas utiliser FCM en raison d'une dépendance technique à un autre service de messagerie, ou les modes Doze et Mise en veille des applications interrompent la fonctionnalité de base de l'application. | Acceptable | ||
| Sécurité personnelle. | Applications qui protègent leurs utilisateurs et leurs familles. | À renseigner le cas échéant. | Acceptable | |
| Application d'automatisation des tâches. | La fonctionnalité de base de l'application consiste à planifier des actions automatisées, par exemple pour la messagerie instantanée, les appels vocaux ou la gestion des nouvelles photos. | À renseigner le cas échéant. | Acceptable | |
| Application associée à un périphérique. | La fonction principale de l'application est de 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 périodiquement pour se synchroniser, ou elle n'a besoin de se connecter qu'à des appareils, tels que des écouteurs sans fil, connectés via des profils Bluetooth standards. | À renseigner le cas échéant. | Non accepté |