Monitorare il livello della batteria e lo stato di ricarica

Quando modifichi la frequenza degli aggiornamenti in background per ridurne l'effetto aggiornamenti sulla durata della batteria, controllare il livello attuale della batteria e lo stato di ricarica è un buon posto per iniziare.

L'impatto sulla durata della batteria dell'esecuzione di aggiornamenti delle applicazioni dipende dal livello della batteria e stato di ricarica del dispositivo. Impatto dell'esecuzione di aggiornamenti quando il dispositivo è in carica tramite CA è trascurabile, perciò nella maggior parte dei casi puoi massimizzare la frequenza di aggiornamento ogni volta che il dispositivo è connesso. a un caricabatteria da muro. Al contrario, se il dispositivo si sta scaricando, ridurre la frequenza di aggiornamento aiuta prolungare la durata della batteria.

Analogamente, puoi controllare il livello di carica della batteria, riducendo potenzialmente la frequenza di... e persino interrompersi: l'aggiornamento viene eseguito quando la batteria è quasi esaurita.

Determinare lo stato di ricarica attuale

Per prima cosa, determina lo stato di addebito attuale. BatteryManager trasmette tutti i dettagli sulla batteria e sulla ricarica in un file Intent fisso che include lo stato di ricarica.

Poiché si tratta di un intent fisso, non è necessario registrare un BroadcastReceiver, semplicemente chiamando il passaggio registerReceiver null come destinatario, come mostrato nello snippet successivo, l'intento corrente relativo allo stato della batteria è restituito. Puoi passare un oggetto BroadcastReceiver effettivo qui, ma gestiremo gli aggiornamenti in una sezione successiva, quindi non è necessario.

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

Puoi estrarre sia lo stato di ricarica corrente sia, se il dispositivo è in carica, se si sta ricaricando tramite caricabatterie USB o CA:

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;

Di solito dovresti massimizzare la frequenza degli aggiornamenti in background nel caso in cui il dispositivo venga collegato a un caricabatterie CA, riduci la velocità se la carica avviene tramite USB e abbassala ulteriormente se la batteria si scarica.

Monitora le variazioni dello stato di ricarica

Lo stato di ricarica può cambiare con la stessa facilità con cui si collega un dispositivo, quindi è importante monitorare lo stato di addebito per rilevare eventuali modifiche e modificare di conseguenza la frequenza di aggiornamento.

BatteryManager trasmette un'azione ogni volta che il dispositivo è connesso o non è stata scollegata dall'alimentazione. È importante ricevere questi eventi anche quando l'app non è in esecuzione, in particolare perché questi eventi dovrebbero influire sulla frequenza di avvio dell'app per avvia un aggiornamento in background, quindi devi registrare un valore BroadcastReceiver nel file manifest per rimanere in ascolto di entrambi gli eventi definendo ACTION_POWER_CONNECTED e ACTION_POWER_DISCONNECTED all'interno di un filtro per 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>

Determina il livello attuale della batteria

In alcuni casi è utile anche determinare il livello attuale della batteria. Puoi scegliere di ridurre la velocità degli aggiornamenti in background se il livello di carica della batteria è inferiore a un certo livello.

Puoi trovare il livello di carica attuale della batteria estraendo il livello e la scala attuali della batteria lo stato della batteria, come mostrato qui:

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;

Reagisci a cambiamenti significativi del livello della batteria

Non è possibile monitorare facilmente lo stato della batteria in modo semplice, ma non è necessario.

In generale, il monitoraggio del livello della batteria ha un impatto maggiore un impatto sulla batteria rispetto al normale comportamento dell'app. Ad esempio, la registrazione di un BroadcastReceiver nel file manifest per annullare il lavoro in sospeso quando la batteria è in esaurimento servono principalmente per consumare ulteriormente la batteria (ed è quindi impossibile poiché Android 8.0). Puoi invece fornire dei vincoli sul lavoro che descrivano quando eseguire l'operazione, consentendo al sistema di prendere una decisione senza poter avviare l'app.

In genere è buona norma non eseguire gli aggiornamenti in background quando la batteria molto basso. A prescindere dal livello di aggiornamento dei dati, se lo smartphone si spegne prima di farne uso. Per farlo, usare la libreria WorkManager con un Vincolo di BatteryNotLow per specificare che l'intervento non deve essere eseguito se la batteria è in esaurimento (oltre alle eventuali NetworkType vincoli).

In molti casi, l'atto di ricaricare un dispositivo coincide con il suo inserimento in un dock. Il prossimo lezione mostra come determinare lo stato attuale del dock e monitorare i cambiamenti nel dispositivo sulla base.