在后台服务中使用 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
通常是启动每小时计时器的最佳选择,即使您的应用不是 运行,它也能正常工作。 AlarmManager
将 Intent
发送到扩展 BroadcastReceiver
的 class,然后 class 将启动您的 Service
。 AlarmManager
可以根据您的实施情况设置在应用中的任何位置。
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 似乎是可行的方法。
你需要
- 通过修改 WakefulBroadcastReceiver
中的模板创建代码
- 将服务和 BroadCastReceiver 添加到清单中。
- schedule a repeating alarm 在您的应用中某处
如果有任何地方不清楚,请说出来。参见 http://code.tutsplus.com/tutorials/android-barometer-logger-acquiring-sensor-data--mobile-10558
@TheoKanning 的回答是手动执行此操作的正确方法。或者,Google Fit 会持续记录此数据,并有一个 API 可用于将其拉入您的应用程序。
我正在考虑实施 Android 4.4 (http://youtu.be/yv9jskPvLUc) 中引入的步进传感器 API。但是,我无法找到关于在后台监控的推荐方法是什么的明确解释?似乎大多数示例只展示了如何在应用程序 运行 时使用 activity 执行此操作。我并不特别需要高频率的更新——我基本上想记录用户每小时走到后端服务的步数。 我应该只启动一个在 SensorManager 上调用 registerListener 的后台服务,还是有更优雅的方法?
据我所知,没有办法绕过 SensorManager
,但如果您很少需要数据,您可以手动触发传感器并使用 TriggerEventListener
获取其值,这比 SensorEventListener
.
AlarmManager
通常是启动每小时计时器的最佳选择,即使您的应用不是 运行,它也能正常工作。 AlarmManager
将 Intent
发送到扩展 BroadcastReceiver
的 class,然后 class 将启动您的 Service
。 AlarmManager
可以根据您的实施情况设置在应用中的任何位置。
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 似乎是可行的方法。
你需要
- 通过修改 WakefulBroadcastReceiver 中的模板创建代码
- 将服务和 BroadCastReceiver 添加到清单中。
- schedule a repeating alarm 在您的应用中某处
如果有任何地方不清楚,请说出来。参见 http://code.tutsplus.com/tutorials/android-barometer-logger-acquiring-sensor-data--mobile-10558
@TheoKanning 的回答是手动执行此操作的正确方法。或者,Google Fit 会持续记录此数据,并有一个 API 可用于将其拉入您的应用程序。