Счетчик шагов в Android: всегда включен?

Хорошо известно, что многие телефоны Android отключают акселерометр, когда экран отключается. Однако, похоже, что-то изменилось с Android Fit (приложение). Fit продолжает отсчет шагов, даже когда экран гаснет. Если Fit установлен, тогда события поднимаются для подсчета шагов в среде Fit, и я могу их захватить с помощью

Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
                .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE)

Я тестировал это на Samsung S4 и Oneplus One, и в обоих случаях шаги учитываются. Как они это делают? Какие классы Android они используют? Я понимаю, что доступный метод введен с того момента, когда Kitkat должен реализовать SensorEventListener. Например, theelfismike предоставляет код, который реализует это. Однако на многих телефонах счетчик шагов останавливается, когда экран выключается. Интересно, что подсчет не прекращается, если установлено приложение Google Fit (поэтому я думаю, что они поддерживают акселерометр).

Я что-то упустил? Является ли функциональность отслеживания шагов подсчета после экрана доступными для смертных программистов? Благодарю!

Ответ 1

Как сказал Илья, ваш код запускается даже после выключения экрана. Но в этом случае, я думаю, нам нужен немного другой ответ.

Они определенно используют Сервис, который хранит wakelock, и они запрашивают датчики для данных. Важная часть здесь заключается в том, что вы держите wakelock - вы должны препятствовать тому, чтобы устройство не спало во время вашей службы - если вы не хотите пропустить некоторые данные.

Но этот подход будет очень эффективно разряжать аккумулятор, потому что для обнаружения шагов вам нужно обработать довольно много данных от датчиков.

Вот почему есть пакетная обработка датчиков. Это позволяет получать непрерывные данные датчика даже без пробуждения устройства. Он в основном хранит события датчиков в hw-based queue прямо в самом чипе и только отправляет их в ваше приложение (сервис,..) с предопределенными интервалами в пакетах. Это позволяет проводить мониторинг 24/7 без значительного разряда батареи. Обратите внимание, что только поддерживаемые чипсеты могут это сделать (вы можете найти подробную информацию в документах Android), в случае старых телефонов вам необходимо вернуться к отвратительному методу хранения wakelock, чтобы получить ваши данные.

Вы также можете просто использовать Google Fit APIs, но это будет работать, только если на устройстве установлены Google Fit + Google Play Services с включенным мониторингом.

Ответ 2

Каждый нормальный поток продолжает работать, когда экран отключается или когда Activity утрачивает фокус... но когда активность убивается, вся нить убивается...

Однако вы можете использовать сервисы для долговременных задач, например, просить акселерометр