2011-12-05 6 views
8

Estoy escribiendo una aplicación simple que contiene dos elementos: Servicio y Actividad. La actividad se usa solo para iniciar y detener el servicio. El servicio usa PhoneStateListener para obtener información sobre CellID actual, LAC y RSSI (intensidad de señal) y registrarlos en un archivo.PhoneStateListener onSignalStrengthsChanged deja de llamarse en el Servicio

Todo funciona bien mientras el teléfono no está durmiendo. Me di cuenta de que después de apagar la pantalla y unos minutos de inactividad, mi PhoneStateListener ya no se invoca. Traté de agregar PARTIAL_WAKE_LOCK (y otros tipos de bloqueos también) en mi servicio, pero supongo que esto causa un agotamiento severo de la batería y no debería usarse de esa manera. Por otro lado, realmente no me ayudó mucho. Mi otro intento fue usar Timer y anular el registro/registrar mi PhoneStateListener en intervalos especificados. Inesperadamente, parece que de esta manera ayudó a refrescar CellId y LAC (así que supongo que se llamó onCellLocationChanged() de mi escucha), pero la intensidad de la señal aún no se actualizaba.

No intenté usar BroadcastReciever, pero después de profundizar en el tema y leer los hilos en SO, no creo que me funcione.

En resumen, mi pregunta: ¿Por qué los métodos PhoneStateListener no se llaman cuando el teléfono está en reposo? ¿Hay alguna manera (como forzar el teléfono a despertar o utilizar un mecanismo diferente) para superar este comportamiento de manera eficiente?

+0

'Inesperadamente, se ve que de esta manera ayudó .. .' no estoy seguro de que esto sea inesperadamente como la documentación para escuchar notas 'Al momento del registro, y cuando cambia un estado de telefonía específico, el administrador de telefonía i anula el método de devolución de llamada apropiado'. – tidbeck

Respuesta

7

Cuando la pantalla está apagada, Android deja de notificar cambios en la celda y la señal. Lo hace deshabilitando las notificaciones de URC en el nivel de RIL. Hasta donde yo sé, no puedes obtener actualizaciones sin encender la pantalla. Un receptor de difusión no funcionaría de manera diferente.

Por lo tanto, si es práctico para usted, le sugiero que active la pantalla cada vez que desee verificar estos valores. Puede hacerlo adquiriendo un bloqueo de activación y proporcionando los indicadores: ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

Editar: Volver a registrar el oyente, de hecho, desencadenar el cambio de ubicación para ser ejecutado, pero no pasar la información de celda actual, sólo la última información de célula conocida con anterioridad a la pantalla de apagarse. Para obtener la información de la celda actual, aún deberá encender la pantalla.

1

llamada al comienzo:

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

y al final:

wakeLock.release(); 

que necesita el permiso:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
Cuestiones relacionadas