¿Cómo evito que un dispositivo Android se suspenda mediante programación?

155

¿Cómo evito que un dispositivo Android se suspenda mediante programación?

James
fuente

Respuestas:

133

Una opción es usar un bloqueo de activación . Ejemplo de los documentos:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

// screen and CPU will stay awake during this section

wl.release();

También hay una tabla en esta página que describe los diferentes tipos de wakelocks.

Tenga en cuenta que se debe tener precaución al usar las cerraduras de activación. Asegúrate de tener siempre release()la cerradura cuando hayas terminado con ella (o no en primer plano). De lo contrario, su aplicación puede causar un serio desgaste de la batería y el uso de la CPU.

La documentación también contiene una página útil que describe diferentes enfoques para mantener un dispositivo despierto y cuándo puede elegir usar uno. Si "evitar que el dispositivo se vaya a dormir" solo se refiere a la pantalla (y no mantiene activa la CPU), entonces un bloqueo de activación es probablemente más de lo que necesita.

También debe asegurarse de tener el permiso WAKE_LOCK establecido en su manifiesto para poder utilizar este método.

eldarerathis
fuente
21
Ya no deberías usar esto ya que este método está en desuso ahora. Echa un vistazo a una de las otras respuestas.
DuKes0mE
44
Todavía hay algunas razones para usar wakelocks, como si el dispositivo está dedicado a una aplicación específica y necesita ejecutarse incluso cuando está minimizado.
Muz
2
PowerManager.PARTIAL_WAKE_LOCK no está en desuso y creo que es el método más eficiente. Permite al usuario presionar el botón de encendido pero la CPU aún se encenderá hasta que se libere la llamada del usuario ();
Mansour Fahad
La documentación oficial dice "Si necesita mantener la CPU en funcionamiento para completar un trabajo antes de que el dispositivo se ponga en suspensión, puede usar una función de servicio del sistema PowerManager llamada bloqueo de activación".
Joaquin Iurchuk
Esta es una excelente manera, pero está en desuso. compruebe esta respuesta: stackoverflow.com/a/22447615/5327912
Parth Anjaria el
240

Si solo desea evitar el modo de suspensión en un modo específico View, simplemente invoque setKeepScreenOn(true)eso Viewo configure la keepScreenOnpropiedad en true. Esto evitará que la pantalla se apague mientras Viewestá en la pantalla. No se requiere un permiso especial para esto.

Witek
fuente
18
Además, esto no obligará al teléfono a permanecer despierto fuera de la vida útil de la aplicación. Puede encontrarse con ese problema con WakeLock.
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
2
Sí, en la mayoría de los casos, este es el mejor enfoque.
Edward Falk
8
Esta debería ser la respuesta seleccionada. Simple, limpio y como Android pretendía. Gracias.
Lior Iluz
2
"Usar android: keepScreenOn =" true "es equivalente a usar FLAG_KEEP_SCREEN_ON. Puede usar el enfoque que sea mejor para su aplicación. La ventaja de configurar la bandera mediante programación en su actividad es que le da la opción de borrar la bandera mediante programación más tarde y permitiendo así que la pantalla se apague "- developer.android.com/training/scheduling/wakelock.html
Antonino
Tenga en cuenta que solo setKeepScreenOn(true)tendrá efecto cuando Viewsea ​​visible.
Jeff T.
121

Encontré otra solución de trabajo: agregue la siguiente línea a su aplicación en el evento onCreate.

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

Mi proyecto de muestra de Cordova se ve así:

package com.apps.demo;
import android.os.Bundle;
import android.view.WindowManager;
import org.apache.cordova.*;

public class ScanManActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        super.loadUrl("http://stackoverflow.com");
    }
}

Después de eso, mi aplicación no se iría a dormir mientras estaba abierta. Gracias por la respuesta a xSus.

dogatónico
fuente
esta fue la mejor opción en mi opinión ... +1
Amit
Esto hace lo mismo que la respuesta de Witek, la única diferencia es que pones esto en un archivo ".java" en lugar de uno ".xml" ;-)
tiktak
¿Qué tal el permiso? ¿Se requiere permiso?
Mehdi Khademloo
@Mehdi Khademloo no necesita permiso.
Wessam El Mahdy
17

Establecer banderas en la ventana de la actividad como a continuación

@Override public void onResume() {
 super.onResume();
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@Override public void onPause() {
 super.onPause();
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
arjun
fuente
6

Desde el shell raíz (por ejemplo, adb shell), puede bloquear con:

echo mylockname >/sys/power/wake_lock    

Después de lo cual el dispositivo permanecerá despierto, hasta que lo haga:

echo mylockname >/sys/power/wake_unlock    

Con la misma cadena para 'mylockname'.

Tenga en cuenta que esto no evitará que la pantalla se ponga negra, pero evitará que la CPU se suspenda.

Tenga en cuenta que / sys / power / wake_lock es lectura-escritura para la radio de usuario (1001) y el sistema de grupo (1000) y, por supuesto, la raíz.

Una referencia está aquí: http://lwn.net/Articles/479841/

jelle foks
fuente
3

Lo que @eldarerathis dijo que es correcto en todos los aspectos, el bloqueo de activación es la forma correcta de evitar que el dispositivo se vaya a dormir.

No sé qué necesita hacer su aplicación, pero es muy importante que piense en cómo diseñar su aplicación para que no obligue al teléfono a permanecer despierto durante más tiempo que necesita, o la vida útil de la batería se verá enormemente afectada.

Le diría a este muy buen ejemplo sobre cómo usar AlarmManagerpara disparar eventos y despertar el teléfono y (su aplicación) para realizar lo que necesita hacer y luego volver a dormir: Administrador de alarmas (fuente: commonsware.com)

lucabox
fuente
Hay aplicaciones de utilidad específicas y con un propósito específico para agotar la batería. Tenía una necesidad por una vez. Básicamente, adquiriría wakelocks, vibraría como loco, encendería la linterna, aumentaría el brillo, etc. Entonces sí, hay aplicaciones que hacen uso de esto. Pero esto estaba fuera de tema, así que perdóname
TheRealChx101
0

Si eres un usuario de Xamarin, esta es la solución:

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); //always call superclass first

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
hogarth45
fuente