在 IntentService (WakefulIntentService) 中延迟(定时)注销传感器侦听器

Delayed (timed) unregister sensor listener inside IntentService (WakefulIntentService)

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

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

当然,IntentService 实现了一个 SensorEventListener,它是使用 CommonsWare cwac-wakeful 作为一个 WakefulIntentService 实现的。

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

这转化为一系列数据读数重叠并被插入到 Google Fit 中,相对于 IntentService 测量任务的原始定时调用没有任何时间顺序。

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

我试图通过在特定超时(30 秒)后调用 post 延迟 Runnable 来注销 IntentService 中的传感器侦听器,但它不起作用。

我的问题是:

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

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

提前致谢。

I've implemented an IntentService which, using SensorManager, reads data from a heart rate sensor.

恕我直言,这不是 IntentService 的正确用法。恕我直言,IntentService 是为工作的交易位设计的:磁盘 I/O、数据库 I/O、Web 服务调用等。它不是为无限期工作设计的。

The IntentService, of course, implements a SensorEventListener and it's implemented as a WakefulIntentService using CommonsWare cwac-wakeful.

WakefulIntentService 不是 为无限期工作而设计的。

What's happening is that sensor reading task takes a very highly variable time and sometimes, onSensorChanged - which I guess works asynchronously once the sensor listener is registered - gets called even minutes later, when the IntentService instance which registered the sensor listener, has already ended and the listener listening (!) is a successive one.

一般来说,无法保证您会获得任何传感器读数,因为一旦服务被销毁,您的进程可能随时终止。

Is there a way, inside an IntentService or a WakefulIntentService to call the sensor unregisterListener after a certain delay preventing the thread to end, meanwhile?

没有任何可靠的方式。

去掉 WakefulIntentService。使用常规 Service。注册传感器事件。当您获得所需的事件时,取消注册传感器侦听器和 stopSelf() 服务。一路走来,管理你自己的 WakeLock.

Or to clear the onSensorChanged queue somehow?

我不知道。

Is there a way to assign an univoque ID to a sensor listener at the moment of its registration?

侦听器对象已经是唯一的。为什么 ID 会使它更独特?

也就是说,欢迎您在侦听器对象中放置一个字段,该字段具有您喜欢的任何类型的唯一值。