2011-12-05 4 views
8

두 가지 요소 인 서비스 및 활동을 포함하는 간단한 애플리케이션을 작성하고 있습니다. 활동은 서비스 시작 및 중지에만 사용됩니다. 서비스는 PhoneStateListener을 사용하여 현재 CellID, LAC 및 RSSI (신호 강도)에 대한 정보를 얻고 파일에 기록합니다.PhoneStateListener onSignalStrengthsChanged가 서비스에서 호출되는 것을 중지합니다.

휴대 전화가 잠 들어 있지 않으면 모든 것이 잘 작동합니다. 나는 화면을 끈 후 몇분 동안 아무런 반응이 없으면 내 PhoneStateListener이 더 이상 호출되지 않는다는 것을 알았다. 내 서비스에 PARTIAL_WAKE_LOCK (및 다른 유형의 잠금 장치도 추가)을 시도했지만 배터리 소모가 심해서 그런 식으로 사용해서는 안됩니다. 다른 한편 그것은 정말로 나를 도와주지 않았다. 나의 또 다른 시도는 Timer를 사용하고 지정된 간격으로 나의 PhoneStateListener을 등록 취소/등록하는 것이었다. 예기치 않게이 방법으로 CellId와 LAC를 새로 고치는 데 도움이되었습니다 (내 청취자의 onCellLocationChanged()이 호출되었으므로 신호 강도가 여전히 업데이트되지 않았 음).

나는 BroadcastReciever을 사용하려고하지 않았지만, 주제에 대해 파고 들었을 때부터 스레드를 읽은 후에는 그것이 나에게 도움이 될 것이라고 생각하지 않습니다.

요약하면, 내 질문 : 전화가 잠 들어있을 때 PhoneStateListener 메서드가 호출되지 않는 이유는 무엇입니까? 이 동작을 효율적으로 극복하기 위해 어떤 방법 (예 : 강제 전화가 깨어나거나 다른 메커니즘을 사용하는 것과 같은)이 있습니까?

+0

'예기치 않게, 그것은이 방법이 도움이되었다고 보이는을 .. . 이것은 예기치 않게 듣기 노트에 대한 문서화가 아닌지 확실하지 않습니다. '등록시, 그리고 지정된 전화 통신 상태가 변경되면 전화 통신 관리자 적절한 콜백 메소드를 호출합니다 .'. – tidbeck

답변

7

화면이 꺼지면 Android 및 셀 변경 사항에 대한 알림이 중지됩니다. RIL 수준에서 URC 알림을 사용하지 않도록 설정합니다. 내가 아는 한, 화면을 켜지 않으면 업데이트를 얻을 수 없습니다. 브로드 캐스트 리시버는 다르게 작동하지 않습니다.

실용적이라면이 값을 확인할 때마다 화면이 켜지도록 제안하십시오. 깨우기 잠금을 획득하고 플래그를 제공하여이를 수행 할 수 있습니다. ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

편집 : 다시 등록 청취자 것은 실제로 실행되는 위치 변경을 트리거하지만 현재 셀 정보, 꺼져가는 이전 화면으로 마지막 알려진 세포 정보를 전달하지 않습니다. 현재 셀 정보를 얻으려면 여전히 화면을 켜야합니다. 시작시

1

전화 :

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "call_lock"); 

과 끝에

:

wakeLock.release(); 

당신이 권한이 필요합니다

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
관련 문제