Cómo mantener activo el dispositivo

Para evitar que se agote la batería, un dispositivo Android que está inactivo se suspende rápidamente. Sin embargo, hay ocasiones en las que una aplicación necesita activar la pantalla o la CPU y mantenerla activa para completar algunas tareas.

El enfoque que elijas dependerá de las necesidades de tu app. Sin embargo, como regla general, debes usar el enfoque más simple posible para tu app a fin de minimizar su impacto en los recursos del sistema. En las siguientes secciones, se describe cómo abordar los casos en los que el comportamiento de suspensión predeterminado del dispositivo no es compatible con los requisitos de tu app.

Alternativas al uso de bloqueos de activación

Antes de agregar compatibilidad con los bloqueos de activación a tu app, considera si sus casos de uso admiten alguna de las siguientes soluciones alternativas:

Cómo mantener encendida la pantalla

Ciertas apps necesitan mantener la pantalla encendida, como las apps de juegos o de cine. La mejor manera de hacerlo es usar el FLAG_KEEP_SCREEN_ON en tu actividad (y solo en una actividad, nunca en un servicio ni en otro componente de la app). Por ejemplo:

Kotlin

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

Java

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);
  }
}

La ventaja de este enfoque es que, a diferencia de los bloqueos de activación (que se analizan en Cómo mantener la CPU encendida), no requiere un permiso especial y la plataforma administra de forma correcta el movimiento del usuario entre aplicaciones, sin que tu app tenga que preocuparse por liberar recursos que no se usan.

Otra forma de implementar esto es en el archivo en formato XML de diseño de tu aplicación, mediante el atributo android:keepScreenOn:

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

Usar android:keepScreenOn="true" equivale a usar FLAG_KEEP_SCREEN_ON. Puedes usar el enfoque que sea mejor para tu app. La ventaja de configurar la marca de manera programática en tu actividad es que te brinda la opción de borrar la marca de manera programática más tarde y, por lo tanto, permitir que se apague la pantalla.

Modo ambiente para TV

En la TV, se debe usar FLAG_KEEP_SCREEN_ON para evitar que el dispositivo entre en Modo ambiente durante la reproducción de video activa. Cuando la actividad en primer plano no establezca FLAG_KEEP_SCREEN_ON, el dispositivo entrará automáticamente al Modo ambiente después de un período de inactividad.

Cómo mantener encendida la CPU

Si necesitas mantener la CPU en ejecución para completar algunas tareas antes de que el dispositivo entre en modo de suspensión, puedes usar una función de servicio del sistema PowerManager llamada bloqueos de activación. Los bloqueos de activación permiten que tu aplicación controle el estado de energía del dispositivo host.

Crear y mantener bloqueos de activación puede tener un impacto significativo en la duración de batería del dispositivo host. Por lo tanto, deberías usarlos solo cuando sea estrictamente necesario y mantenerlos el menor tiempo posible. Por ejemplo, nunca deberías necesitar un bloqueo de activación en una actividad. Como se describió anteriormente, si quieres mantener la pantalla encendida en tu actividad, usa FLAG_KEEP_SCREEN_ON.

Un caso legítimo para usar un bloqueo de activación puede ser un servicio en segundo plano que necesite un bloqueo de activación para que la CPU siga funcionando mientras la pantalla está apagada. Sin embargo, esta práctica debe minimizarse debido a su impacto en la duración de la batería.

Para usar un bloqueo de activación, el primer paso es agregar el permiso WAKE_LOCK al archivo de manifiesto de tu aplicación:

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

Si tu app incluye un receptor de emisión que usa un servicio para realizar algunas tareas, puedes configurar un bloqueo de activación directamente de la siguiente manera:

Kotlin

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
                acquire()
            }
        }

Java

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

Para retirar el bloqueo de activación, llama a wakelock.release(). De esta manera, se libera tu reclamación a la CPU. Para evitar que se agote la batería, es importante liberar un bloqueo de activación apenas tu app termine de usarlo.