5

Hola Estoy intentando utilizar un servicio para controlar un wakelock para poder dejar permanentemente la pantalla cuando se ejecuta mi aplicación. Creo el wakelock y lo activo en onCreate() y lo lanzo en onDestroy() sin embargo recibo el error "wl no se puede resolver". ¿Alguien puede explicar cómo puedo superar esto? Código de abajo:Uso de un wakelock en un servicio Android 1.5

public class WakeLockService extends Service { 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public void onCreate() { 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
    } 
    @Override 
    public void onDestroy() { 
     wl.release(); 
    } 
} 

Respuesta

5

¿No te falta la línea

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 

en OnDestroy()? Es una variable local en onCreate(), pero no está declarada en onDestroy() en absoluto.

O, más probable, es posible que desee convertirlo en un campo de la clase WakeLockService en lugar de una variable local.

9

Bueno, incluso si usara una variable de instancia, creo que esta no es la manera de hacerlo. ¿Quién va a llamar al destroy()? Espero que no, es el trabajo del sistema operativo para hacerlo. Pero cuando está manteniendo un bloqueo de activación es muy poco probable que se llame al método destroy(), porque el sistema operativo destruirá primero otras actividades/servicios.

Además de eso, es demasiado tarde para adquirir el bloqueo de activación en el método onCreate(). Antes de que se llegue al onCreate(), es posible que el teléfono ya se haya dormido cuando active el Servicio desde una alarma contra una actividad que esté en segundo plano.

Es difícil decir lo que debe hacer diferente ya que no le da mucho contexto. El curso habitual de los eventos es esto. Se llama a BroadcastReceiver y en el onReceive() adquiere el bloqueo de activación y lo coloca en una variable estática en su servicio. Cuando finaliza el servicio, debe llamar al stopSelf(), liberar el bloqueo de activación y luego anular la variable estática que guarda una referencia al bloqueo.

Además, si utiliza un servicio, es muy probable que un bloqueo de activación no sea el deseado, pero sí un bloqueo parcial de activación. No necesita la pantalla para permanecer encendido, ¿verdad?

Lo sentimos, pero los bloqueos por activación son muy complicados de usar, debido exactamente a los problemas que describí anteriormente. Definitivamente es un tema avanzado y es fácil arruinarlo. Si lo haces, tu aplicación recibirá comentarios muy desagradables, porque aguantar demasiado tiempo es una ofensa importante ya que agota la batería. No lo tome de la manera incorrecta, pero dada la naturaleza del problema que publicó aquí (error de sintaxis/compilador), le sugiero encarecidamente que busque una solución sin un Servicio y que active el bloqueo.

+0

Gracias por el comentario. En la aplicación en la que estoy trabajando necesito que el teléfono esté en modo 100% de activación, por lo tanto, ¿por qué utilicé el bloqueo de activación total? – Tom

+0

Un wakelock parcial debería ser suficiente para encender la CPU y usar la red. – Eno

+0

Gracias de mí también. Su explicación es sucinta, y más útil que la pregunta y la respuesta combinadas :) – Melllvar

Cuestiones relacionadas