Monitorare il livello della batteria e lo stato di ricarica

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.