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, reducir la frecuencia de actualización prolongar 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 incluso cuando la carga de la batería está por agotarse.
Cómo determinar el estado de carga actual
En primer lugar, determina el estado de carga actual. El BatteryManager
transmite todos los detalles de la batería y la carga en un Intent
fijo que incluye
el estado de carga.
Como se trata de un intent persistente, no necesitas registrar un BroadcastReceiver
; solo debes llamar a registerReceiver
y pasarlo.
null
como receptor, como se muestra en el siguiente fragmento, el intent de estado actual de la batería es
que se devuelven. Puedes pasar un objeto BroadcastReceiver
real, pero
Nos encargaremos de las actualizaciones
más adelante, por lo que no es necesario.
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, si se Se está cargando a través de un cargador de CA o 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 cambiar tan fácilmente como puede conectarse un dispositivo. Por ello, es importante supervisarlo por si se producen cambios, y modificar la frecuencia de actualización según corresponda.
El BatteryManager
emite una acción cada vez que el dispositivo se conecta o desconecta de la corriente. Es importante recibir estos eventos incluso cuando la app no esté activa.
especialmente porque estos eventos deberían 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 escuchar ambos eventos definiendo el
ACTION_POWER_CONNECTED
y ACTION_POWER_DISCONNECTED
dentro de 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.
Puedes ver la carga actual de la batería al extraer el nivel actual de la batería y la escala de 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;
Reacciona a cambios significativos en el nivel de batería
No es fácil controlar continuamente el estado de la batería, pero tampoco es necesario.
En términos generales, el impacto de supervisar el nivel de batería es mayor que el comportamiento habitual de la app. Por ejemplo, registrar un BroadcastReceiver
en el manifiesto para cancelar el trabajo pendiente cuando la batería esté baja servirá principalmente para agotarla aún más (por lo que es imposible desde Android 8.0). En su lugar, puedes proporcionar restricciones sobre el trabajo que describan cuándo se debe ejecutar,
lo que permite que el sistema tome la decisión sin tener que iniciar la app.
Cuando el nivel de batería esté demasiado bajo, te recomendamos que no ejecutes las actualizaciones en segundo plano, Si el teléfono se apaga antes de que lo hagas, no importa qué tan actualizados estén los datos
puede aprovecharla. Para ello, usa la biblioteca de WorkManager con una restricción BatteryNotLow
para especificar que el trabajo no se debe ejecutar si la batería está baja (además de cualquier restricción NetworkType
relevante).
En muchos casos, el hecho de cargar un dispositivo coincide con la acción de colocarlo en una estación de carga. Para obtener más información, consulta Determinar supervisar el tipo y el estado del conector.