Что лучше всего делать при опросе значений датчиков?

Я работаю над приложением, в котором мне периодически нужно получать значение датчика. Для этого я использую AlarmManager и Receiver с заданными интервалами. Реализация датчика Android, по-видимому, сосредоточена на непрерывном чтении данных, и кажется невозможным опросить одно текущее чтение.

Мой вопрос в том, что лучше всего использовать для «симуляции» механизма опроса? Есть ли примеры, которых я не встречал? Один из подходов состоит в том, чтобы просто вызвать registerListener(), получить текущее значение, а затем вызвать stopListener(). Но, похоже, это не работает, так как чтение недоступно мгновенно.


person hanspeide    schedule 15.05.2011    source источник


Ответы (1)


Вы можете использовать тот же подход, который я использовал в этом проекте для опроса мест. Используйте WakeLock, чтобы устройство оставалось в активном состоянии, и попросите службу зарегистрировать прослушиватель датчика в onStartCommand(). Когда поступит событие датчика, отпустите WakeLock и вызовите stopSelf(), чтобы закрыть службу.

person CommonsWare    schedule 16.05.2011
comment
Я чувствую, что пример Github немного излишен для этой задачи. Я думаю, мне просто нужно знать, как отслеживать, когда событие наступает. Кстати: это виджет, который нуждается в этих периодических обновлениях, и я пытаюсь прочитать значение давления/барометра с устройства, используя SensorEventListener, который сильно отличается от LocationManager. - person hanspeide; 16.05.2011
comment
Кроме того, он должен работать только в Honeycomb. Можно ли использовать BroadcastReceiver.PendingResult? - person hanspeide; 16.05.2011
comment
@hpe: я чувствую, что пример Github немного излишен для этой задачи. -- Добро пожаловать на ваше мнение. Можно ли использовать BroadcastReceiver.PendingResult? -- ненадежно, так как вы можете не получить событие датчика достаточно быстро. Прочтите документацию для goAsync(): goo.gl/rLxj4 - person CommonsWare; 16.05.2011
comment
Ничего личного :) Но я попробовал, и теперь это работает! Большое спасибо. - person hanspeide; 16.05.2011
comment
@CommonsWare: Можно ли адаптировать ваш пример Github для использования с датчиком акселерометра? Или в этом случае будет полезен AlarmManager, поскольку датчик акселерометра постоянно работает и выводит результаты. Я не хочу, чтобы onSensorChanged запускался всегда, а вместо этого запускался по таймеру, что, я думаю, может помочь AlarmManager, но не уверен. Извините, я не хотел захватить пост hanspeide, но мое требование аналогично его требованию относительно опроса датчиков. - person ChuongPham; 13.12.2013
comment
@ChuongPham: можно ли адаптировать ваш пример Github для использования с датчиком акселерометра? -- Типа, я полагаю. Датчики ненадежны в фоновом режиме, так как некоторые производители устройств отключают их для экономии заряда батареи, особенно на старых устройствах. Еще одно существенное отличие заключается в том, что вам нужно будет собрать набор показаний, чтобы вы могли выполнить сглаживание данных, поскольку акселерометр довольно дерганый. - person CommonsWare; 13.12.2013
comment
@CommonsWare: Спасибо, Марк. Да, я думаю, когда дело доходит до акселерометра, нет одной стратегии, которая будет достаточной. Я попробую несколько вещей и посмотрю, как я пойду. Кстати, у вас на Github есть немало хороших примеров, Wakelock — один из них... - person ChuongPham; 13.12.2013