Skip to content

Most visited

Recently visited

navigation

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

Al modificar la frecuencia de las actualizaciones en segundo plano para reducir el efecto de las mismas 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 en la duración de la batería derivado de actualizar aplicaciones varía en función del nivel de batería y del estado de carga del dispositivo. Cuando el dispositivo está conectado a la corriente, el impacto derivado de actualizar aplicaciones 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. BatteryManager envía los detalles de carga y de la batería en un Intent persistente que incluye el estado de carga.

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

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 está cargando, puedes saber también si se está usando un cargador de corriente alterna o por USB:

// 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;

Normalmente, debes maximizar la frecuencia de las actualizaciones en segundo plano si el dispositivo está conectado a un cargador de corriente alterna, disminuir esa frecuencia si se utiliza 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 cambiar tan fácilmente como puede conectarse un dispositivo. Por ello, es importante supervisar el estado de carga por si se producen cambios, y modificar la frecuencia de actualización según corresponda.

BatteryManager emite una acción siempre que el dispositivo se conecta o desconecta de la corriente. Es importante recibir estos eventos aunque la aplicación no esté en ejecución (especialmente porque estos eventos pueden afectar la frecuencia con la que inicias tu app para iniciar una actualización en segundo plano), por lo que debes registrar un BroadcastReceiver en tu manifiesto para detectar ambos eventos definiendo 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>

En la implementación de BroadcastReceiver asociada, puedes extraer el método y el estado de carga actual como se describe en el paso anterior.

public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL;

        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
    }
}

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.

Puedes consultar la carga actual de la batería al extraer el nivel actual de la batería y el nivel máximo a partir de la intent de estado de batería, como se muestra a continuación:

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

float batteryPct = level / (float)scale;

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

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

En términos generales, el impacto sobre la batería derivado de controlar continuamente el nivel de batería es mayor que el comportamiento habitual de la app. Por lo tanto, es recomendable que supervises únicamente los cambios en el nivel de batería más significativos, especialmente cuando el dispositivo entre o salga de un estado de batería baja.

El fragmento de manifiesto que aparece a continuación se ha extraído del elemento de filtro de intent de un receptor de emisión. El receptor se activa cuando la carga de la batería del dispositivo alcanza un nivel bajo, o cuando se desactiva el estado de carga reducida de batería, a través de la recepción de ACTION_BATTERY_LOW y ACTION_BATTERY_OKAY.

<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
  <action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
  <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
  </intent-filter>
</receiver>

Cuando el nivel de batería esté demasiado bajo, es buena idea inhabilitar las actualizaciones en segundo plano. Si el teléfono se apaga antes de poder utilizarlo, no importa qué tan actualizados estén los datos.

En muchos casos, el hecho de cargar un dispositivo coincide con la acción de utilizar un conector. La próxima lección, trata sobre cómo determinar el estado actual del conector y cómo supervisar los cambios que se produzcan al conectar el dispositivo.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)