Quando modifichi la frequenza degli aggiornamenti in background per ridurre l'effetto di questi aggiornamenti sulla durata della batteria, è consigliabile iniziare controllando il livello corrente della batteria e lo stato di ricarica.
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 la ricarica avviene tramite USB o caricabatterie 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.
Monitorare le modifiche dello stato di ricarica
Lo stato di ricarica può cambiare con la stessa facilità con cui un dispositivo può essere collegato, quindi è importante monitorare lo stato di ricarica 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 con cui avvii l'app per avviare un aggiornamento in background. Pertanto, devi registrare un BroadcastReceiver
nel file manifest per ascoltare entrambi gli eventi definendo ACTION_POWER_CONNECTED
e ACTION_POWER_DISCONNECTED
all'interno di un filtro 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>
Determinare il livello corrente della batteria
In alcuni casi è utile anche determinare il livello attuale della batteria. Puoi scegliere di ridurre la frequenza degli aggiornamenti in background se la carica della batteria è inferiore a un determinato livello.
Puoi trovare la carica attuale della batteria estraendo il livello e la scala attuali della batteria dall'intent stato batteria, come mostrato di seguito:
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;
Reagire a variazioni significative del livello batteria
Non puoi monitorare facilmente e continuamente lo stato della batteria, 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 attesa quando la batteria è in esaurimento servirà principalmente a scaricarla ulteriormente (e pertanto è impossibile da Android 8.0). In alternativa, puoi fornire vincoli sul lavoro che descrivono quando deve essere eseguito,
consentendo al sistema di prendere la decisione senza consumare potenza all'avvio dell'app.
In genere è buona norma non eseguire gli aggiornamenti in background quando la batteria è in esaurimento. Non importa quanto siano aggiornati i dati se lo smartphone si spegne prima che tu possa utilizzarli. Per farlo,
utilizza la libreria WorkManager
con un
vincolo BatteryNotLow
per specificare che il lavoro non deve essere eseguito se la batteria è in esaurimento (oltre a eventuali vincoli NetworkType
pertinenti).
In molti casi, caricare un dispositivo è coincidente con il suo inserimento in un dock. Per saperne di più, vedi Determinare e e monitorare lo stato e il tipo di docking.