IntentService内的延迟(定时)取消注册传感器侦听器(WakefulIntentService)

时间:2017-03-20 14:13:04

标签: android android-sensors intentservice commonsware-cwac sensormanager

我已经实现了IntentService,使用SensorManager从心率传感器读取数据。

使用AlarmManagerWakefulBroadcastReceiver定期调用它,然后在onSensorChanged后,使用健身历史记录API更新Google健身数据,使用onSensorChanged调用的时间作为时间戳。

IntentService当然实现了SensorEventListener,并使用CommonsWare cwac-wakeful实现为WakefulIntentService

正在发生的事情是,传感器读取任务需要非常多变的时间,有时,onSensorChanged - 我猜想,一旦传感器监听器被注册,它就异步工作 - 甚至在几分钟之后被调用IntentService注册传感器监听器的实例已经结束,监听器监听(!)是连续的。

这转换为一系列数据读数重叠并插入到Google健身中,与IntentService测量任务的原始定时调用无任何时间顺序。

此外,这种行为也会导致电池的异常使用,因为心率传感器使用了几个非常明亮的LED,并且 - 除非未注册 - 保持活跃状态​​,直到我猜测它的硬件超时。

我试图通过在特定超时(30秒)后调用延迟IntentService的帖子来取消注册Runnable内的传感器侦听器,但它无法正常工作。

我的问题是:

IntentServiceWakefulIntentService内是否有办法在一定延迟后调用传感器unregisterListener以防止线程结束?或者以某种方式清除onSensorChanged队列?

或者:有没有办法在注册时为传感器监听器分配一个univoque ID?这样,在onSensorChanged内,就可以将事件与其原始IntentService调用时间进行匹配,并且可以 - 至少 - 可以使用正确的时间顺序在Google Fit中插入读数

提前谢谢。

1 个答案:

答案 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会让它更独特?

话虽如此,欢迎您在侦听器对象中放置一个具有您喜欢的任何独特值的字段。