Cómo mantener activo el dispositivo

Para evitar que se agote la batería, un dispositivo Android que está inactivo se cae rápidamente dormido. Sin embargo, hay momentos en que una aplicación necesita activar la pantalla o la CPU y la mantiene activa para completar el trabajo.

El enfoque que elijas dependerá de las necesidades de tu app. Sin embargo, una regla general general es que debes usar el enfoque más ligero posible para tu para minimizar el impacto de tu app en los recursos del sistema. Las siguientes secciones describir cómo abordar los casos en los que el comportamiento de suspensión predeterminado del dispositivo es incompatible con los requisitos de tu aplicación.

Alternativas al uso de bloqueos de activación

Antes de agregar compatibilidad con los bloqueos de activación a tu app, considera si su uso los casos admiten una 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. El la mejor manera de hacerlo FLAG_KEEP_SCREEN_ON en tu actividad (y solo en una actividad; nunca en un servicio u otra app (componente de seguridad). 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 CPU On), no se requiere un permiso especial, y la plataforma administra de forma correcta el movimiento del usuario entre aplicaciones, sin que esta necesite preocuparse por liberar recursos sin usar.

Otra forma de implementar esto es en el archivo XML de diseño de tu aplicación, usando 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>

El uso de android:keepScreenOn="true" equivale a usar FLAG_KEEP_SCREEN_ON Puedes usar el enfoque que mejor se adapte a tu app. La ventaja de establecer la marca de forma programática en tu actividad es que te da la opción de eliminar de manera programática la marca más tarde y así permitir que la pantalla gire desactivado.

Modo ambiente para TV

En la TV, FLAG_KEEP_SCREEN_ON para evitar que el dispositivo ingrese Modo ambiente durante la reproducción de video activa. Cuando no se establece FLAG_KEEP_SCREEN_ON debido a la actividad en primer plano, el dispositivo ingresará automáticamente al Modo ambiente tras un período de inactividad.

Cómo mantener encendida la CPU

Si necesitas mantener la CPU en ejecución para completar algunos trabajos cuando un dispositivo se suspende, puedes usar Función del servicio del sistema PowerManager llamados bloqueos de activación. Los bloqueos de activación permiten que tu app controle el estado de energía del dispositivo host.

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

Un caso legítimo para usar un bloqueo de activación podría ser un servicio en segundo plano necesita un bloqueo de activación para mantener la CPU en ejecución y poder realizar el trabajo mientras la pantalla está apagada. desactivado. Sin embargo, esta práctica debería minimizarse debido a su impacto en la duración de batería.

Para usar un bloqueo de activación, el primer paso es agregar el permiso WAKE_LOCK para el 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 A continuación, te mostramos cómo establecer un bloqueo de activación directamente:

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 wakelock.release() De esta manera, se retira tu reclamación de la CPU. Es importante abrir un bloqueo de activación tan pronto como la app termine de usarlo, para evitar que se agote la batería.