Состояние мощности 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)
. Это датчик, который будет использовать большинство приложений.