2010-01-11 9 views
44

Mi WakeLock no mantiene mi dispositivo en funcionamiento.¿Cómo funciona un Android WakeLock?

En OnCreate() Tengo:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag"); 
mWakeLock.acquire(); 

a continuación:

new CountDownTimer(1320000, 200) { 

    public void onTick(long millisUntilFinished) { 
     // I update a progress bar here.           
    } 

    public void onFinish() { 
     // I finish updating the progress bar. 
     mWakeLock.release(); 
    } 
}.start(); 

La pantalla se apaga antes de que finalice el temporizador, ¿cómo puedo hacer permanecer visible la pantalla?

mWakeLock es un campo previamente declarado como tal:

private PowerManager.WakeLock mWakeLock; 

Mi dispositivo utiliza Android 1.6. Realmente agradecería cualquier ayuda para resolver esto.

Respuesta

49

¿Tiene el conjunto permission requerido en su Manifiesto?

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+0

De hecho. Verifique su salida de logcat en el momento en que llame al wakelock. El sistema generalmente le advierte sobre permisos perdidos. –

+0

Tengo esos permisos establecidos, y el sistema operativo Android menciona los permisos cuando instalo la aplicación. – Curyous

+1

Solo estoy adivinando, pero otra cosa para comprobar es que en el momento en que creó el bloqueo de activación, la pantalla todavía no se ha apagado. Para adquirir() solo garantiza la preservación/restauración del estado de energía en el momento en que se creó el bloqueo de activación. Después de todo: de la descripción de su problema, no podemos estar seguros de que la pantalla todavía estaba encendida/visible en el momento en que llamó a CountDownTimer.start(). –

2

Tengo un problema similar. Puedo hacer que la pantalla permanezca encendida, pero si uso un bloqueo parcial de activación y la pantalla se apaga, mi función de activación no se activa hasta que se enciende la pantalla.

Puede verificar su bloqueo de wake utilizando mWakeLock.isHeld(), antes que nada, para asegurarse de obtenerlo. La forma más fácil es agregar eso al código, establecer un punto de interrupción en el depurador y luego verificarlo.

En mi caso, lo estoy obteniendo, pero el bloqueo parcial de activación no parece estar haciendo nada. Aquí está mi código de trabajo para el bloqueo de pantalla tenue.

protected void setScreenLock(boolean on){ 
     if(mWakeLock == null){ 
      PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
      mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | 
             PowerManager.ON_AFTER_RELEASE, TAG); 
     } 
     if(on){ 
     mWakeLock.acquire(); 
     }else{ 
      if(mWakeLock.isHeld()){ 
       mWakeLock.release(); 
      } 
     mWakeLock = null; 
     } 

    } 

Adición:

Droid Eris y el Droid usuarios están informando a mí que esto no funciona en sus dispositivos, aunque funciona bien en mi G1. ¿En qué dispositivo estás probando? Creo que esto puede ser un error de Android.

104

WakeLock por lo general no causa problemas de reinicio. Puede haber algunos otros problemas en su codificación. WakeLock encierra la batería pesadamente, si no se la libera después del uso.

WakeLock es una forma ineficiente de mantener la pantalla encendida. En su lugar, use WindowManager para hacer la magia. La siguiente línea será suficiente para WakeLock. El permiso WakeLock también es necesario para que esto funcione. También este código es más eficiente que wakeLock.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

No necesita descargar el WakeLock manualmente. Este código permitirá que el sistema Android maneje el bloqueo automáticamente. Cuando su aplicación está en primer plano, WakeLock se retiene y, de lo contrario, el sistema Android libera el bloqueo automáticamente.

Prueba esto y publicar su comentario ...

+0

No creo que necesite el permiso de bloqueo de activación para hacerlo de la manera de WindowManager. – Karu

+0

sí, el permiso de bloqueo de vigilia no es necesario. Puesto actualizado –

+0

¡GUAU! He usado powermanager para adquirir el wakelock en muchas aplicaciones, ¡lo que me ha dado muchos problemas! ¡Esta es una forma muy eficiente! gracias @AndroidKid! – udiboy1209

1

Asegúrese de que no se limpia mWakeLock accidentalmente antes de que esté listo para liberarlo. Si está finalizado, se libera el bloqueo. Esto puede suceder, por ejemplo, si lo configura en nulo y luego se ejecuta el recolector de elementos no utilizados. También puede suceder si configura accidentalmente una variable local del mismo nombre en lugar de la variable de nivel de método.

También recomendaría revisar LogCat para las entradas que tienen la etiqueta PowerManagerService o la etiqueta que pasa al newWakeLock.

23

sólo hay que escribir esto:

private PowerManager.WakeLock wl; 

    protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
      wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen"); 
    }//End of onCreate 

      @Override 
     protected void onPause() { 
      super.onPause(); 
      wl.release(); 
     }//End of onPause 

     @Override 
     protected void onResume() { 
      super.onResume(); 
      wl.acquire(); 
     }//End of onResume 

y luego agregar el permiso en el archivo de manifiesto

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

Ahora su actividad siempre estará despierto. Puede hacer otras cosas como w1.release() según su requisito.

2

Gracias por este hilo. He estado teniendo dificultades para implementar un temporizador en mi código durante 5 minutos para ejecutar una actividad, porque mi teléfono lo configuré para que se apagara/durmiera unos 2 minutos. Con la información anterior, parece que he podido solucionar el problema.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    /* Time Lockout after 5 mins */ 
    getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 

    Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 

     public void run() { 

     Intent i = new Intent(AccountsList.this, AppEntryActivity.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(i); 
     finish(); 
     return; 

     } 

    }, 300000); 
    /* Time Lockout END */ 
} 
2

código de ejemplo fragmento de android developers site

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    } 

Best Practices for Background Jobs

6

para lograr el mismo programática puede utilizar después de

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

o la adición siguiente en diseño también llevará a cabo lo anterior tarea

android:keepScreenOn="true" 

Los detalles se pueden obtener de siguiente dirección http://developer.android.com/training/scheduling/wakelock.html

he utilizado combinación de siguiente para despertar a mi pantalla cuando el bloqueo de teclas bloquea y mantener la pantalla en la

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
6

Añadir el permiso por AndroidManifest.xml , como se detalla a continuación

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

prefera bly ANTES de las etiquetas de declaración <application>, pero DESPUÉS de las etiquetas <manifest>, intente hacer que su método onCreate() contenga solo la instancia de WakeLock.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); 
    mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag"); 
} 

y luego en su lugar onResume() método

@Override 
public void onResume() { 
    mWakeLock.aquire(); 
} 

y en su lugar el método onFinish()

@Override 
public void onFinish() { 
    mWakeLock.release(); 
} 
1
{PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 
WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock"); 
wakeLock.acquire();} 

uso de este código y no se olvide de permitir wakelock en Android manifiesto

2

Mantenga la pantalla de

Primera forma:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

Segunda forma:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:keepScreenOn="true"> 
    ... 
</RelativeLayout> 

Mantenga la CPU en:

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

y

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag"); 
wakeLock.acquire(); 

Para liberar el bloqueo de activación, llame al wakelock.release(). Esto libera tu reclamo a la CPU. Es importante liberar un bloqueo de activación tan pronto como la aplicación termine de usarlo para evitar el drenaje de la batería.

Docs here.

Cuestiones relacionadas