Mode suspendu

États d'alimentation du SoC

Les états d'alimentation du système sur une puce (SoC) sont les suivants : "Marche", "Inactif" et "Suspendu". "Activé" correspond à l'état du SoC lorsqu'il est en cours d'exécution. "Inactif" est un mode d'alimentation moyen dans lequel le SoC est alimenté, mais n'effectue aucune tâche. "Suspend" (Suspendre) est un mode basse consommation où le SoC n'est pas alimenté. La consommation d'énergie de l'appareil dans ce mode est généralement 100 fois inférieure à celle en mode "Activé".

Capteurs non réveillés

Les capteurs non réveillés sont des capteurs qui n'empêchent pas le SoC de passer en mode suspension et ne le réveillent pas pour envoyer des données. En particulier, les pilotes ne sont pas autorisés à maintenir des réveils. Il incombe aux applications de conserver un wakelock partiel si elles souhaitent recevoir des événements de capteurs non réveillés lorsque l'écran est éteint. Lorsque le SoC est en mode suspension, les capteurs doivent continuer à fonctionner et à générer des événements, qui sont placés dans un FIFO matériel. (Pour en savoir plus, consultez la section Grouper les requêtes.) Les événements de la file d'attente FIFO sont transmis aux applications lorsque le SoC se réveille. Si la file d'attente FIFO est trop petite pour stocker tous les événements, les événements les plus anciens sont perdus. Les données les plus anciennes sont supprimées pour laisser la place aux données les plus récentes. Dans le cas extrême où le FIFO est inexistant, tous les événements générés lorsque le SoC est en mode suspension sont perdus. Une exception concerne le dernier événement de chaque capteur de changement: le dernier événement doit être enregistré en dehors de la file d'attente FIFO afin qu'il ne puisse pas être perdu.

Dès que le SoC sort du mode suspension, tous les événements du FIFO sont signalés et les opérations reprennent normalement.

Les applications qui utilisent des capteurs non réveillés doivent soit maintenir un verrouillage de réveil pour s'assurer que le système ne passe pas en mode suspension, soit se désenregistrer des capteurs lorsqu'elles n'en ont pas besoin, soit s'attendre à perdre des événements lorsque le SoC est en mode suspension.

Capteurs d'activation

Contrairement aux capteurs non réveillés, les capteurs de réveil garantissent que leurs données sont transmises indépendamment de l'état du SoC. Lorsque le SoC est actif, les capteurs de réveil se comportent comme des capteurs non réveillés. Lorsque le SoC est en veille, les capteurs de réveil doivent le réveiller pour qu'il envoie des événements. Ils doivent toujours laisser le SoC passer en mode suspension, mais ils doivent également le réveiller lorsqu'un événement doit être signalé. Autrement dit, le capteur doit réveiller le SoC et transmettre les événements avant que la latence de rapport maximale ne soit écoulée ou que le FIFO matériel ne soit saturé. Pour en savoir plus, consultez Grouper les requêtes.

Pour s'assurer que les applications ont le temps de recevoir l'événement avant que le SoC ne se remette en veille, le pilote doit maintenir un "verrouillage de réveil par expiration" pendant 200 millisecondes chaque fois qu'un événement est signalé. En d'autres termes, le SoC ne doit pas être autorisé à se remettre en veille dans les 200 millisecondes suivant une interruption de réveil. Cette exigence disparaîtra dans une prochaine version d'Android. En attendant, nous avons besoin de ce délai de verrouillage de réveil.

Comment définir les capteurs de réveil et les capteurs non de réveil ?

Jusqu'à KitKat, le fait qu'un capteur soit un capteur de réveil ou non était déterminé par le type de capteur: la plupart étaient des capteurs de réveil, à l'exception du capteur de proximité et du détecteur de mouvement significatif.

À partir de la version L, la présence ou non d'un capteur de réveil est spécifiée par un indicateur dans la définition du capteur. La plupart des capteurs peuvent être définis par des paires de variantes de réveil et de non-réveil du même capteur, auquel cas ils doivent se comporter comme deux capteurs indépendants, qui n'interagissent pas entre eux. Pour en savoir plus, consultez la section Interaction.

Sauf indication contraire dans la définition du type de capteur, il est recommandé d'implémenter un capteur de réveil et un capteur non de réveil pour chaque type de capteur listé dans la section Types de capteurs. Dans chaque définition de type de capteur, vérifiez quel capteur (déclenchement ou non) sera renvoyé par SensorManager.getDefaultSensor(sensorType). C'est le capteur que la plupart des applications utiliseront.