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.