2010-07-23 2 views
0
  1. 브로드 캐스트 리시버는 브로드 캐스트를받는 가동 잠금을 열어
  2. 서비스가 다른 가동 잠금을 열고 서비스를 시작, 다음
  3. 서비스 수행의 가동 잠금 해제 가동 잠금 방송을
  4. 된 브로드 캐스트 방송 '출시 가동 잠금을 "수신 전송하고 출시 그것의 것 및 그것의 wakelock를 풀어 놓으십시오

그러나 문제가있다. 현재 BroadcastReceiver는 WakeLock을 멤버 변수로 저장합니다. 때로는 가비지 컬렉터가 BroadcastReceiver가 서비스를 시작한 후부터 릴리스 wakelock 브로드 캐스트를 받기 전에 실행되고, wakelock이 릴리스되기 전에 (가비지 수집 이후) 강제 종료됩니다.Android BroadcastReceiver가 서비스가 WakeLock을 서비스로 시작 또는 전송할 때까지 대기합니까?

그래서 나는 onReceive 방법에서 다음 중 하나를 수행해야합니다 그것의 가동 잠금을 설정 한 다음, 브로드 캐스트 리시버의 가동 잠금을 해제하는 서비스가 시작 대기에 대한

  • 대기; '출시 가동 잠금'방송이 더 이상
  • 필요하거나, 어떻게 든 서비스에 가동 잠금을 전송 한 후 서비스가 하나의 가동 잠금을 해제하기위한 책임을 질 것입니다 것 하나가 더 나은 옵션입니다

및 나는 그것을 어떻게 성취 할 것인가?

답변

0

정적 인 WakeLock을 사용하십시오. 더 나은 아직 내 전체 패턴을 마무리 내 WakefulIntentService, 사용하십시오.

+0

서비스를 제거하고 내 BroadcastReceiver 내부의 모든 것을 구현하지 않는 이유가 있습니까? 아마 나는 서비스를받는 것에 너무 많은 무게를 쏟아 붓고 아마도 이것 모두는 불필요하다고 생각합니다. 사실, 시스템은 onReceive 메소드의 지속 기간 동안 WakeLock을 설정하기 때문에 (나는 모든 것을 처리 할 것입니다) wakelocks가 필요하지 않습니다. – Ricket

+0

"서비스를 제거하고 내 BroadcastReceiver 내부의 모든 것을 구현하지 않는 이유가 있습니까?" - 할 일이 빠르면 (예 : 50ms), 수신기로 모두 돌려 보겠습니다. 그렇지 않으면 포 그라운드 프로세스에서 중요한 CPU 시간을 훔치고 포 그라운드에있을 경우 활동의 기본 응용 프로그램 스레드를 묶습니다. 'onReceive()'는 전경 우선 순위로 실행되기 때문에 심각한 일을하는 경우 사용자가 그 당시에 재생할 수있는 게임의 프레임 속도를 깨는 데 충분한 CPU주기를 흡수 할 수 있습니다. – CommonsWare

관련 문제