2014-10-21 8 views
2

기기 위치를 수동 모드로 기록하기 위해 간단한 Android GPS 추적 서비스 앱을 만들었습니다. CPU를 계속 사용하려면 잠자기를 사용해야하지만 신뢰할 수는 없습니다. 때때로 앱이 3 시간 동안 실행됩니다. 때로는 전체 24 시간주기를 수행 할 수 있습니다. 나는 화면에 충돌 보고서를 얻지 못한다. 앱은 아무런 표시없이 멈춘다. 배터리 수명이 좋습니다.Wakelock이 항상 내 앱을 계속 유지하지 못하는 경우

나는 변수 주요 활동 클래스

static WakeLock wakeLock; 

으로 가동 잠금을 선언하고 바로 GPS 서비스

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock((PowerManager.PARTIAL_WAKE_LOCK),"MyAppNameWakelock"); 
wakeLock.setReferenceCounted(true); 
wakeLock.acquire(); 
화면 변경 이유

나는 또한 BACK 버튼 기능에 대한 업데이트를 시작하기 전에 한 번 가동 잠금을 설정 정상 작동 대신 moveTaskToBack(true);을 실행하십시오. 이것과 관련이있을 수 있습니까?

전원 코드 또는 USB 코드 연결과 같이 사용중인 wockockock을 제거 할 수있는 기계적인 상호 작용이 있습니까?

그런데 내 앱이 중지 된 이유를 확인할 수있는 Android의 모든 로그가 있습니까?

+0

"전원 코드 나 USB 코드를 연결하는 것과 같은 사용중인 wakelock을 제거 할 수있는 기계적인 상호 작용이 있습니까?" -- 아니. "내 앱이 왜 멈췄습니까?" - Android가 프로세스를 중단했기 때문에 가능성이 큽니다. 프로세스는 영원히 살지 않습니다. – CommonsWare

답변

1

이론적으로 앱이 다른 이유로 사망하지 않고 wakelock 권한을 가지고 있다면 (여기를 참조하십시오 : <uses-permission android:name="android.permission.WAKE_LOCK" /> 참조) 앱은 계속 살아 있어야합니다.

외부 이벤트에 의해 wakelocks가 제거되었는지 여부는 커널에 따라 다를 수 있습니다. & 장치에 따라 다릅니다. 일부 커널은 wakelocks를 죽이는 결정을 내릴 수있는 매우 강력한 전력 관리 기능을 가지고 있습니다. 더 많은 기기에서 앱을 실행 했습니까?

그러나 다른 이벤트가 내 응용 프로그램을 죽인 경우 조사 할 것입니다 (예 : 메모리 사용량 증가).

또 다른 아이디어는 "finalize"메서드를 무시하고 가비지 수집기가 wakelock에 도달하여 죽을 때 메시지를 출력하지 못하게하는 것입니다.

+0

죄송합니다. 조금 늦었 습니다만, OP와 같은 문제가 있습니다. finalize 메서드를 재정의하는 방법에 대해 게시 할 수 있습니까? 감사! 페데리코. –