2011-12-05 11 views
8

Piszę prostą aplikację zawierającą dwa elementy - Service and Activity. Aktywność jest używana tylko do rozpoczynania i zatrzymywania usługi. Serwis używa numeru PhoneStateListener, aby uzyskać informacje o bieżącym CellID, LAC i RSSI (siła sygnału) i zalogować je do pliku.PhoneStateListener onSignalStrengthsChanged przestaje być wywoływany w Service

Wszystko działa dobrze, gdy telefon nie śpi. Zauważyłem, że po wyłączeniu ekranu i kilku minutach bezczynności mój PhoneStateListener nie jest już wywoływany. Próbowałem dodać PARTIAL_WAKE_LOCK (i inne typy blokad) do mojej usługi, ale myślę, że powoduje to poważne wyczerpanie baterii i nie powinno być używane w ten sposób. Z drugiej strony jednak nie pomogło mi to. Moją kolejną próbą było użycie Timera i wyrejestrować/zarejestrować moje PhoneStateListener w określonych odstępach czasu. Niespodziewanie wygląda na to, że w ten sposób pomógł w odświeżeniu CellId i LAC (domyślam się, że został nazwany onCellLocationChanged() od mojego słuchacza), ale siła sygnału wciąż nie była aktualizowana.

Nie próbowałem używać BroadcastReciever, ale po pewnym zagłębieniu się w temat i przeczytaniu wątków na SO nie sądzę, by to działało dla mnie.

Podsumowując, moje pytanie: Dlaczego metody PhoneStateListener nie są wywoływane, gdy telefon jest w trybie uśpienia? Czy jest jakikolwiek sposób (np. Wymuszenie użycia telefonu lub użycie innego mechanizmu) w celu skutecznego przezwyciężenia tego zachowania?

+0

'Niespodziewanie, to wygląda, że ​​w ten sposób pomógł .. . "Nie jest to pewne, że jest to nieoczekiwanie dokumentacja dotycząca notatek odsłuchowych" Podczas rejestracji i kiedy zmienia się określony stan telefonii, menedżer telefonii i nvokes odpowiednią metodę wywołania zwrotnego. " – tidbeck

Odpowiedz

7

Gdy ekran jest wyłączony, android przestaje powiadamiać o zmianie komórki i sygnału. Czyni to, wyłączając powiadomienia URC na poziomie RIL. O ile wiem, nie można uzyskać aktualizacji bez włączania ekranu. Odbiornik telewizyjny nie działa inaczej.

Więc jeśli jest to dla Ciebie praktyczne, sugeruję włączenie ekranu, gdy chcesz sprawdzić te wartości. Możesz to zrobić, zdobywając blokadę wybudzania i podając flagi: ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

Edit: Re-rejestracji słuchacza będzie w rzeczywistości spowodować zmianę lokalizacji do wykonania, ale nie przechodzą bieżące informacje komórki, tylko ostatnią znaną informacji komórkowej przed ekranie dzieje się. Aby uzyskać aktualne informacje o komórce, nadal trzeba włączyć ekran.

1

wezwanie na początku:

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

i na koniec:

wakeLock.release(); 

trzeba pozwolenie:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
Powiązane problemy