在后台服务中使用 TYPE_STEP_COUNTER?

Using TYPE_STEP_COUNTER in a background service?

我正在考虑实施 Android 4.4 (http://youtu.be/yv9jskPvLUc) 中引入的步进传感器 API。但是,我无法找到关于在后台监控的推荐方法是什么的明确解释?似乎大多数示例只展示了如何在应用程序 运行 时使用 activity 执行此操作。我并不特别需要高频率的更新——我基本上想记录用户每小时走到后端服务的步数。 我应该只启动一个在 SensorManager 上调用 registerListener 的后台服务,还是有更优雅的方法?

据我所知,没有办法绕过 SensorManager,但如果您很少需要数据,您可以手动触发传感器并使用 TriggerEventListener 获取其值,这比 SensorEventListener.

干净一点

AlarmManager 通常是启动每小时计时器的最佳选择,即使您的应用不是 运行,它也能正常工作。 AlarmManagerIntent 发送到扩展 BroadcastReceiver 的 class,然后 class 将启动您的 ServiceAlarmManager 可以根据您的实施情况设置在应用中的任何位置。

StepCountService

SensorManager sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
Sensor stepCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
sensorManager.requestTriggerSensor(listener, stepCounter);

private TriggerEventListener listener = new TriggerEventListener(){
    @Override
    public void onTrigger(TriggerEvent event) {
        //handle step count here 
    }
}

MainActivity

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, AlarmReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
    PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,AlarmManager.INTERVAL_HOUR, 
    AlarmManager.INTERVAL_HOUR, alarmIntent);

报警接收器

public class AlarmReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    Intent service = new Intent(context, StepCountService.class);
    context.startService(service);
  }
} 

这不是一个完整的解决方案,但最 energy-efficient 的方法可能是每隔一小时左右唤醒您的设备,启动一个快速读取数据的服务,然后再进入休眠状态。

根据您的目标设备级别,使用 WakefulBroadcastReceiver, as described in this answer 似乎是可行的方法。

你需要

  1. 通过修改 WakefulBroadcastReceiver
  2. 中的模板创建代码
  3. 将服务和 BroadCastReceiver 添加到清单中。
  4. schedule a repeating alarm 在您的应用中某处

如果有任何地方不清楚,请说出来。参见 http://code.tutsplus.com/tutorials/android-barometer-logger-acquiring-sensor-data--mobile-10558

@TheoKanning 的回答是手动执行此操作的正确方法。或者,Google Fit 会持续记录此数据,并有一个 API 可用于将其拉入您的应用程序。