0

SensorManager을 사용하여 IntentService을 구현했으며 심박 센서에서 데이터를 읽습니다.IntentService (WakefulIntentService) 내에 센서 리스너가 지연 (시간 지정) 됨

그것은 주기적으로 AlarmManager를 사용하여 호출되는과 WakefulBroadcastReceiver하고는, onSensorChanged에, 그것은 타임 스탬프로 onSensorChanged 호출의 시간을 사용, 피트니스 역사의 API를 사용하여 Google 피트니스 데이터를 업데이트합니다.

물론 IntentServiceSensorEventListener을 구현하며 CommonsWare cwac-wakeful을 사용하여 WakefulIntentService으로 구현됩니다.

센서 읽기 작업을 수행하는 데 매우 많은 시간이 걸리며 때로는 onSensorChanged - 센서 수신기가 등록되면 비동기 적으로 작동합니다. 센서 수신기를 등록한 IntentService 인스턴스가 나올 때까지 몇 분 후에 호출됩니다. 청취자 (!)는 이미 연속되어 있습니다.

이는 측정 작업 IntentService의 원래 시간 지정 호출과 관련하여 일시적 순서없이 겹치고 Google 피트니스에 삽입되는 일련의 데이터 판독 값으로 변환됩니다.

심박수 센서는 매우 밝고 강한 LED를 사용하기 때문에 배터리의 비정상적인 사용을 유발합니다. 등록을하지 않은 경우를 제외하고는 하드웨어 시간 초과가 될 때까지 계속 활성 상태를 유지합니다.

특정 시간 초과 (30 초) 후 Runnable 지연된 게시물을 호출하여 IntentService 내부의 센서 수신기를 등록 취소하려고했지만 작동하지 않습니다.

내 질문은 :

있는 방법 한편, 마지막에 실을 방지 일정 지연 후 센서 unregisterListener를 호출하는 IntentService 또는 WakefulIntentService 내부 있습니까? 또는 onSensorChanged 대기열을 어떻게 든 지우려면?

다른 방법 : 등록 순간에 센서 리스너에 고유 한 ID를 할당 할 수있는 방법이 있습니까? 이렇게하면 onSensorChanged 내부에서 해당 이벤트를 원래의 IntentService 호출 시간과 일치시킬 수 있으며 적절한 시간 순서로 Google Fit에 판독 값을 삽입 할 수 있습니다.

미리 감사드립니다.

답변

0

SensorManager를 사용하여 심박수 센서에서 데이터를 읽는 IntentService를 구현했습니다.

이 호는 IntentService을 올바르게 사용하지 않습니다. IMHO, IntentService은 디스크 I/O, 데이터베이스 I/O, 웹 서비스 호출 등과 같은 트랜잭션 비트 작업용으로 설계되었습니다. 이것은 무기한으로 작동하도록 설계되지 않았습니다.

IntentService는 물론 SensorEventListener를 구현하며 CommonsWare cwac-wakeful을 사용하여 WakefulIntentService로 구현됩니다.

WakefulIntentService 무기한 일을 위해 설계 하지입니다.

무엇이 일어나고있는 것은 그 센서 판독 작업은 매우 매우 다양 시간이 걸립니다이며 때로는 onSensorChanged - 센서 리스너가 등록되면 내가 비동기 적으로 일을 생각하는 - 심지어 분 후에 호출되는 경우 센서를 등록 IntentService 인스턴스 listener가 이미 종료되었고 수신 대기자 (!)가 연속 수신자입니다.

일반적으로 서비스가 파괴되면 언제든지 프로세스가 종료 될 수 있으므로 센서 판독 값을 보장받을 수 없습니다.

이 방법은 IntentService 또는 한편, 끝이 실을 방지 소정 지연 후에 상기 센서 unregisterListener에게 전화 WakefulIntentService 내부 있는가?

신뢰할 수있는 방식으로 작성된 것이 아닙니다.

WakefulIntentService을 제거하십시오. 일반 Service을 사용하십시오. 센서 이벤트에 등록하십시오. 원하는 이벤트를 얻었 으면 센서 리스너 등록을 취소하고 stopSelf() 서비스를 등록 취소합니다. 길을 따라 자신의 WakeLock을 관리하십시오.

또는 onSensorChanged 큐를 어떻게 든 지우려면?

아니요.

등록 시점에 센서 리스너에 고유 한 ID를 할당 할 수있는 방법이 있습니까?

리스너 객체는 이미 고유합니다. ID가 왜 더 독특하게 만들까요?

당신이 좋아하는 어떤 종류의 고유 한 값을 가진 필드를 리스너 객체에 넣을 수 있습니다.

+0

감사합니다. WakefulBroadcastReceiver가 시작한 서비스를 구현하고 있습니다. 웨이크 잠금 장치를 확보하고 해제하라는 제안은 어디에서합니까? onCreate에서 획득하고 onDestroy에서 출시하거나 onSensorChanged에서 stop 자신의 직후에 출시합니까? 감사! – Veertualia

+0

@Veertualia : "잠자기 후 잠김을 해제하고 해제하는 것이 좋습니다." - 커프를 벗고, onStartCommand()에서 참조 카운트 된 WakeLock을 얻습니다. (WakeLock은 WakefulBroadcastReceiver에서 릴리즈됩니다.) 그런 다음'stopSelf()'처리의 일부로'WakeLock'을 해제하십시오. 직접적인 해결책은 아니지만 내 'WakefulIntentService'에서 영감을 얻을 수 있습니다. – CommonsWare

+0

당신이 말한대로 했어요. 이제 Runnable이 작동하고 리스너 등록을 취소하기 전에 시간 제한을 설정할 수 있습니다. 센서가 너무 오래 걸리고 더 이상 중복되는 onSensorChanged가 없으면 센서를 중지 할 수 있습니다. 완벽 해. @CommonsWare는 어떻게 당신에게 적절한 신용을 줄 수 있습니까? – Veertualia