Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Cómo supervisar el nivel de batería y el estado de carga

Cuando modifiques la frecuencia de las actualizaciones en segundo plano para reducir su efecto en la duración de la batería, te recomendamos que comiences por comprobar el estado de carga y el nivel actual de la batería.

El impacto que tienen las actualizaciones de apps en la duración de la batería varía según el estado de carga y el nivel de la batería del dispositivo. Cuando el dispositivo está conectado a la corriente, el impacto es insignificante. Por lo tanto, en la mayoría de los casos, puedes maximizar la frecuencia de actualización cuando el dispositivo está conectado a un cargador de pared. Por el contrario, si el dispositivo está en proceso de descarga, disminuir la frecuencia de actualización te permitirá aumentar la duración de la batería.

Del mismo modo, puedes comprobar el nivel de carga de la batería y reducir la frecuencia de las actualizaciones (o incluso detenerlas) cuando la batería esté a punto de agotarse.

Cómo determinar el estado de carga actual

En primer lugar, determina el estado de carga actual. El BatteryManager envía los detalles de carga y de la batería en un Intent persistente que incluye el estado de carga.

Puesto que se trata de un intent persistente, no necesitas registrar un BroadcastReceiver; con solo llamar a registerReceiver y pasar null como el receptor, como se muestra en el siguiente fragmento, se muestra el intent de estado actual de la batería. Puedes pasar un objeto BroadcastReceiver real, pero hablaremos sobre las actualizaciones en otra sección, por lo que no es necesario ahora.

Kotlin

    val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->
        context.registerReceiver(null, ifilter)
    }
    

Java

    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = context.registerReceiver(null, ifilter);
    

Puedes extraer el estado de carga actual y, si el dispositivo se está cargando, puedes ver si se está usando un cargador de CA o un USB.

Kotlin

    val status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
    val isCharging: Boolean = status == BatteryManager.BATTERY_STATUS_CHARGING
            || status == BatteryManager.BATTERY_STATUS_FULL

    // How are we charging?
    val chargePlug: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1
    val usbCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_USB
    val acCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_AC
    

Java

    // Are we charging / charged?
    int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
    boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                         status == BatteryManager.BATTERY_STATUS_FULL;

    // How are we charging?
    int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
    boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
    

Por lo general, deberías maximizar la frecuencia de las actualizaciones en segundo plano cuando el dispositivo está conectado a un cargador de CA, disminuir esa frecuencia si se usa un cargador USB y reducirla aún más si la batería se está descargando.

Cómo supervisar los cambios en el estado de carga

El estado de carga puede modificarse muy fácilmente. Por ello, es importante supervisarlo por si hay cambios y modificar la frecuencia de actualización según corresponda.

El BatteryManager emite una acción siempre que el dispositivo se conecta o desconecta de la corriente. Es importante recibir estos eventos, incluso si la aplicación no está en ejecución (especialmente porque pueden afectar la frecuencia con la que inicias tu app a fin de iniciar una actualización en segundo plano), por lo que debes registrar un BroadcastReceiver en el manifiesto para detectar ambos eventos mediante la definición de ACTION_POWER_CONNECTED y ACTION_POWER_DISCONNECTED en un filtro de intents.

<receiver android:name=".PowerConnectionReceiver">
      <intent-filter>
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
      </intent-filter>
    </receiver>

Cómo determinar el nivel de batería actual

En algunos casos, también es útil determinar el nivel de batería actual. Puedes disminuir la frecuencia de las actualizaciones en segundo plano si el nivel de carga de la batería es inferior a un valor determinado.

Para ver el nivel actual de batería, debes extraer la escala y el nivel de batería actual desde el intent de estado de la batería, como se muestra a continuación:

Kotlin

    val batteryPct: Float? = batteryStatus?.let { intent ->
        val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
        val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
        level * 100 / scale.toFloat()
    }
    

Java

    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

    float batteryPct = level * 100 / (float)scale;
    

Cómo supervisar cambios importantes en el nivel de la batería

No es fácil controlar continuamente el estado de la batería, pero tampoco es necesario.

En términos generales, verificar constantemente el nivel de batería afecta más el nivel de la batería que el comportamiento normal de tu app, por lo tanto, se recomienda solo supervisar los cambios importantes (en especial cuando el dispositivo entra o sale de un estado de carga bajo).

El fragmento de manifiesto que aparece a continuación se extrajo del elemento de filtro de intents de un receptor de emisión. Se activa el receptor cuando la carga de la batería del dispositivo alcanza un nivel bajo o se desactiva el estado de carga reducida de batería mediante la recepción de ACTION_BATTERY_LOW y ACTION_BATTERY_OKAY.

    <receiver android:name=".BatteryLevelReceiver">
      <intent-filter>
        <action android:name="android.intent.action.BATTERY_LOW"/>
        <action android:name="android.intent.action.BATTERY_OKAY"/>
      </intent-filter>
    </receiver>

Cuando el nivel de batería esté demasiado bajo, te recomendamos que inhabilites las actualizaciones en segundo plano, ya que no importa qué tan actualizados estén los datos si el teléfono se apaga antes de que puedas usarlos.

En muchos casos, el hecho de cargar un dispositivo coincide con la acción de utilizar un conector. En la próxima lección, se explica cómo determinar el estado actual del conector y cómo supervisar los cambios que se producen cuando se conecta el dispositivo.