我已经实现了IntentService
,使用SensorManager
从心率传感器读取数据。
使用AlarmManager
和WakefulBroadcastReceiver
定期调用它,然后在onSensorChanged
后,使用健身历史记录API更新Google健身数据,使用onSensorChanged调用的时间作为时间戳。
IntentService
当然实现了SensorEventListener
,并使用CommonsWare cwac-wakeful实现为WakefulIntentService
。
正在发生的事情是,传感器读取任务需要非常多变的时间,有时,onSensorChanged
- 我猜想,一旦传感器监听器被注册,它就异步工作 - 甚至在几分钟之后被调用IntentService
注册传感器监听器的实例已经结束,监听器监听(!)是连续的。
这转换为一系列数据读数重叠并插入到Google健身中,与IntentService
测量任务的原始定时调用无任何时间顺序。
此外,这种行为也会导致电池的异常使用,因为心率传感器使用了几个非常明亮的LED,并且 - 除非未注册 - 保持活跃状态,直到我猜测它的硬件超时。
我试图通过在特定超时(30秒)后调用延迟IntentService
的帖子来取消注册Runnable
内的传感器侦听器,但它无法正常工作。
我的问题是:
在IntentService
或WakefulIntentService
内是否有办法在一定延迟后调用传感器unregisterListener
以防止线程结束?或者以某种方式清除onSensorChanged队列?
或者:有没有办法在注册时为传感器监听器分配一个univoque ID?这样,在onSensorChanged
内,就可以将事件与其原始IntentService
调用时间进行匹配,并且可以 - 至少 - 可以使用正确的时间顺序在Google Fit中插入读数
提前谢谢。
答案 0 :(得分:0)
我已经实现了一个IntentService,它使用SensorManager从心率传感器读取数据。
恕我直言,这不是IntentService
的正确使用。恕我直言,IntentService
专为事务处理工作而设计:磁盘I / O,数据库I / O,Web服务调用等。它不适用于无限期工作。
当然,IntentService实现了一个SensorEventListener,它使用CommonsWare cwac-wakeful实现为WakefulIntentService。
WakefulIntentService
不专为无限期工作而设计。
正在发生的事情是传感器读取任务需要非常高的可变时间,有时,onSensorChanged - 我猜想一旦传感器监听器被注册就异步工作 - 甚至在几分钟之后,当注册传感器监听器的IntentService实例时,它被调用已经结束并且监听器(!)是连续的。
一般情况下,无法保证您将获得任何传感器读数,因为您的流程可以在服务销毁后随时终止。
有没有办法,在IntentService或WakefulIntentService中调用传感器unregisterListener一段时间后阻止线程结束?
不是以任何可靠的方式。
摆脱WakefulIntentService
。使用常规Service
。注册传感器事件。当您获得所需的事件时,取消注册传感器侦听器并stopSelf()
该服务。在此过程中,管理您自己的WakeLock
。
或者以某种方式清除onSensorChanged队列?
不是我知道的。
有没有办法在注册时为传感器监听器分配一个univoque ID?
侦听器对象已经是唯一的。为什么ID会让它更独特?
话虽如此,欢迎您在侦听器对象中放置一个具有您喜欢的任何独特值的字段。