【发布时间】:2017-03-20 14:13:03
【问题描述】:
我已经实现了一个 IntentService,它使用 SensorManager 从心率传感器读取数据。
使用AlarmManager 和WakefulBroadcastReceiver 定期调用它,然后在onSensorChanged 上,它使用Fitness History API 更新Google Fit 数据,使用onSensorChanged 调用的时间作为时间戳。
当然,IntentService 实现了 SensorEventListener,它使用 CommonsWare cwac-wakeful 实现为 WakefulIntentService。
发生的情况是传感器读取任务需要一个非常可变的时间,有时,onSensorChanged - 我猜一旦注册传感器侦听器就会异步工作 - 甚至在几分钟后被调用,当时注册了 IntentService 实例传感器监听器,已经结束并且监听器监听(!)是一个连续的。
这意味着一系列数据读数重叠并插入到 Google Fit 中,相对于 IntentService 测量任务的原始定时调用没有任何时间顺序。
此外,这种行为还会导致电池使用异常,因为心率传感器使用几个非常亮的 LED 并且 - 除非未注册 - 一直保持活动状态,直到我猜它的硬件超时。
我尝试通过在特定超时(30 秒)后调用延迟 Runnable 的帖子来取消注册 IntentService 内的传感器侦听器,但它不起作用。
我的问题是:
有没有办法,在IntentService 或WakefulIntentService 内部,在一定的延迟后调用传感器unregisterListener,同时阻止线程结束?或者以某种方式清除 onSensorChanged 队列?
或者:有没有办法在注册时为传感器侦听器分配一个唯一 ID?这样,在onSensorChanged 内,就可以将事件与其原始IntentService 调用时间相匹配,并且可以 - 至少 - 可以以正确的时间顺序在 Google Fit 中插入读数。
提前谢谢你。
【问题讨论】:
标签: android android-sensors intentservice commonsware-cwac sensormanager