Состояния питания SoC
Состояния питания системы на кристалле (SoC): включено, простаивает и находится в режиме ожидания. «Вкл.» — когда SoC работает. «Простой» — это режим среднего энергопотребления, в котором SoC включен, но не выполняет никаких задач. «Приостановка» — это режим с низким энергопотреблением, при котором SoC не получает питания. Энергопотребление устройства в этом режиме обычно в 100 раз меньше, чем в режиме «Вкл.».
Датчики без пробуждения
Датчики без пробуждения — это датчики, которые не препятствуют переходу SoC в режим приостановки и не пробуждают SoC для передачи данных. В частности, водителям не разрешается удерживать вейк-локи. Приложения обязаны сохранять частичную блокировку пробуждения, если они хотят получать события от датчиков, не активизирующихся, когда экран выключен. Пока SoC находится в режиме ожидания, датчики должны продолжать функционировать и генерировать события, которые помещаются в аппаратный FIFO. (Дополнительные сведения см. в разделе Пакетная обработка.) События в FIFO доставляются в приложения, когда SoC просыпается. Если FIFO слишком мал для хранения всех событий, более старые события теряются; самые старые данные отбрасываются для размещения последних данных. В крайнем случае, когда FIFO не существует, все события, сгенерированные, когда SoC находится в режиме приостановки, теряются. Единственным исключением является последнее событие от каждого датчика смены: последнее событие должно быть сохранено вне FIFO, чтобы его нельзя было потерять.
Как только SoC выходит из режима приостановки, сообщается обо всех событиях из FIFO, и операции возобновляются в обычном режиме.
Приложения, использующие датчики без пробуждения, должны либо удерживать блокировку пробуждения, чтобы система не перешла в режим ожидания, либо отменять регистрацию датчиков, когда они им не нужны, либо ожидать потери событий, пока SoC находится в режиме ожидания.
Датчики пробуждения
В отличие от датчиков без пробуждения датчики пробуждения гарантируют, что их данные доставляются независимо от состояния SoC. Пока SoC находится в активном состоянии, датчики пробуждения ведут себя как обычные датчики пробуждения. Когда SoC находится в спящем режиме, датчики пробуждения должны активировать SoC для доставки событий. Они по-прежнему должны позволить SoC перейти в режим ожидания, но также должны разбудить его, когда необходимо сообщить о событии. То есть датчик должен разбудить SoC и доставить события до того, как истечет максимальная задержка отчета или аппаратный FIFO не заполнится. Подробнее см. в разделе Пакетная обработка .
Чтобы у приложений было время получить событие до того, как SoC снова перейдет в спящий режим, драйвер должен удерживать «блокировку пробуждения по тайм-ауту» в течение 200 миллисекунд каждый раз, когда сообщается о событии. То есть SoC не должен снова переходить в спящий режим в течение 200 миллисекунд после прерывания пробуждения. Это требование исчезнет в будущем выпуске Android, и до тех пор нам нужна блокировка пробуждения по тайм-ауту.
Как определить датчики пробуждения и не пробуждения?
Вплоть до KitKat, был ли датчик пробуждения или не пробуждения, определялся типом датчика: большинство из них были датчиками не пробуждения, за исключением датчика приближения и детектора значительного движения .
Начиная с L, является ли данный датчик датчиком пробуждения или нет, указывается флагом в определении датчика. Большинство датчиков можно определить парами пробуждающих и неактивируемых вариантов одного и того же датчика, и в этом случае они должны вести себя как два независимых датчика, не взаимодействующих друг с другом. См. Взаимодействие для более подробной информации.
Если в определении типа датчика не указано иное, рекомендуется реализовать один датчик пробуждения и один датчик без пробуждения для каждого типа датчика, указанного в Типы датчиков . В каждом определении типа датчика посмотрите, какой датчик (пробуждающийся или непробуждающийся) будет возвращен SensorManager.getDefaultSensor(sensorType)
. Это датчик, который будет использовать большинство приложений.