Lorsque vous modifiez la fréquence des mises à jour en arrière-plan pour réduire leur impact sur l'autonomie de la batterie, il est conseillé de commencer par vérifier le niveau et l'état de charge actuels de la batterie.
L'impact des mises à jour d'applications sur l'autonomie de la batterie dépend du niveau de la batterie et de l'état de charge de l'appareil. L'impact des mises à jour lorsque l'appareil est en charge sur le secteur est négligeable. Dans la plupart des cas, vous pouvez donc maximiser votre fréquence d'actualisation chaque fois que l'appareil est branché à un chargeur mural. À l'inverse, si l'appareil se décharge, réduire la fréquence de mise à jour permet de prolonger l'autonomie de la batterie.
De même, vous pouvez vérifier le niveau de charge de la batterie, ce qui peut réduire la fréquence de vos mises à jour ou même les arrêter lorsque la batterie est presque vide.
Déterminer l'état de charge actuel
Commencez par déterminer l'état actuel du débit. Le BatteryManager
diffuse tous les détails de la batterie et de la charge dans un Intent
persistant qui indique l'état de charge.
Comme il s'agit d'un intent persistant, vous n'avez pas besoin d'enregistrer un BroadcastReceiver
. Il vous suffit d'appeler registerReceiver
en transmettant null
comme récepteur, comme indiqué dans l'extrait de code suivant. L'intent d'état de la batterie actuel est alors renvoyé. Vous pouvez transmettre ici un objet BroadcastReceiver
réel, mais nous traiterons les mises à jour dans une section ultérieure. Cela n'est donc pas nécessaire.
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);
Vous pouvez extraire l'état de charge actuel et, si l'appareil est en charge, s'il se recharge via un chargeur USB ou un chargeur secteur :
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;
En règle générale, vous devez maximiser la fréquence des mises à jour en arrière-plan si l'appareil est branché sur un chargeur, le réduire si la recharge est via USB, puis la réduire encore si la batterie se décharge.
Surveiller les changements d'état de charge
L'état de charge peut changer aussi facilement qu'un appareil peut être branché. Il est donc important de surveiller l'état de charge pour détecter les changements et d'ajuster votre fréquence d'actualisation en conséquence.
BatteryManager
diffuse une action chaque fois que l'appareil est connecté ou déconnecté de l'alimentation. Il est important de recevoir ces événements même lorsque votre application n'est pas en cours d'exécution, en particulier car ces événements doivent avoir un impact sur la fréquence à laquelle vous démarrez votre application pour lancer une mise à jour en arrière-plan. Vous devez donc enregistrer un BroadcastReceiver
dans votre fichier manifeste pour écouter les deux événements en définissant ACTION_POWER_CONNECTED
et ACTION_POWER_DISCONNECTED
dans un filtre d'intent.
<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>
Déterminer le niveau de batterie actuel
Dans certains cas, il est également utile de déterminer le niveau actuel de la batterie. Vous pouvez choisir de réduire la fréquence des mises à jour en arrière-plan si la charge de la batterie est inférieure à un certain niveau.
Vous pouvez déterminer la charge actuelle de la batterie en extrayant le niveau actuel de la batterie et en effectuant une mise à l'échelle à partir de l'intent d'état de la batterie, comme indiqué ci-dessous:
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;
Réagir à des changements significatifs du niveau de la batterie
Vous ne pouvez pas surveiller facilement l'état de la batterie, mais ce n'est pas nécessaire.
De manière générale, la surveillance du niveau de la batterie a un impact plus important sur la batterie que le comportement normal de votre application. Par exemple, l'enregistrement d'un BroadcastReceiver
dans le fichier manifeste pour annuler les tâches en attente lorsque la batterie est faible servira principalement à la décharger davantage (et est donc impossible depuis Android 8.0). Au lieu de cela, vous pouvez fournir des contraintes sur le travail qui décrivent le moment où il doit être exécuté, ce qui permet au système de prendre la décision sans épuiser de la puissance de démarrage de votre application.
Il est généralement recommandé de ne pas exécuter les mises à jour en arrière-plan lorsque la batterie est très faible. Peu importe la fraîcheur de vos données si le téléphone s'éteint avant que vous ne puissiez les utiliser. Pour ce faire, utilisez la bibliothèque WorkManager avec une contrainte BatteryNotLow
pour spécifier que la tâche ne doit pas être exécutée si la batterie est faible (en plus des contraintes NetworkType
pertinentes).
Dans de nombreux cas, le fait de charger un appareil coïncide avec son placement sur une station d'accueil. Pour en savoir plus, consultez la section Déterminer et surveiller l'état et le type de la station d'accueil.