sleeping - ¿Cómo funciona un Android WakeLock?
screen_dim_wake_lock (13)
¿Tiene el permission requerido establecido en su Manifiesto?
<uses-permission android:name="android.permission.WAKE_LOCK" />
Mi WakeLock no mantiene mi dispositivo despierto.
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();
entonces:
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 termine el temporizador, ¿cómo puedo hacer que la pantalla permanezca visible?
mWakeLock
es un campo previamente declarado como tal:
private PowerManager.WakeLock mWakeLock;
Mi dispositivo usa Android 1.6. Realmente agradecería cualquier ayuda para resolver esto.
Agregar permiso en AndroidManifest.xml:
<uses-permission android:name="android.permission.WAKE_LOCK" />
A continuación, agregue el código en my.xml:
android:keepScreenOn="true"
en este caso, nunca se apagará la página! Puedes leer más this
Agregue permiso en AndroidManifest.xml
, como se indica a continuación
<uses-permission android:name="android.permission.WAKE_LOCK" />
preferiblemente ANTES de sus etiquetas de declaración de <application>
pero DESPUÉS de las etiquetas <manifest>
, intente hacer que su método onCreate()
contenga solo la creación de instancias 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 el lugar del método onResume()
@Override
public void onResume() {
mWakeLock.aquire();
}
y en su lugar del método onFinish()
@Override
public void onFinish() {
mWakeLock.release();
}
Asegúrese de que mWakeLock
no se haya limpiado 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 pasas a newWakeLock
.
Estoy teniendo 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 activación utilizando mWakeLock.isHeld (), en primer lugar, 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;
}
}
APÉNDICE:
Los usuarios de Droid Eris y DROID me informan 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.
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 */
}
Intente utilizar el indicador ACQUIRE_CAUSES_WAKEUP cuando crea el bloqueo de activación. El indicador ON_AFTER_RELEASE solo restablece el temporizador de actividad para mantener la pantalla un poco más larga.
http://developer.android.com/reference/android/os/PowerManager.html#ACQUIRE_CAUSES_WAKEUP
Para lograr la misma programática puede usar siguiente
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
o agregando siguiente en el diseño también realizará la tarea anterior
android:keepScreenOn="true"
Los detalles que puede obtener de la siguiente URL http://developer.android.com/training/scheduling/wakelock.html
He usado una combinación de seguimiento para activar la pantalla cuando el bloqueo de teclas está bloqueado y mantener mi pantalla encendida
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
Solo tienes 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 agrega permisos en el archivo de manifiesto
<uses-permission android:name="android.permission.WAKE_LOCK" />
Ahora tu actividad siempre estará despierta. Puede hacer otras cosas como w1.release()
según su requisito.
WakeLock generalmente no causa problemas de reinicio. Puede haber algunos otros problemas en su codificación. WakeLock encierra la batería pesadamente, si no se 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. Además, 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 publica tu comentario ...
fragmento de código de muestra del http://developer.android.com/training/scheduling/wakelock.html
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);
}
Mantenga la pantalla encendida
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 encendida:
<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 wakelock.release()
, llame a 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.
Documentos here .
{PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock");
wakeLock.acquire();}
usa este código y no te olvides de permitir wakelock en el manifiesto de Android