Akku- und Ladestatus überwachen

Wenn Sie die Häufigkeit der Hintergrundaktualisierungen ändern, um die Auswirkungen dieser Aktualisierungen auf die Akkulaufzeit zu verringern, sollten Sie zuerst den aktuellen Akkustand und den Ladestatus prüfen.

Die Auswirkungen von App-Updates auf die Akkulaufzeit hängen vom Akkustand und vom Ladezustand des Geräts ab. Auswirkungen von Updates, während das Gerät über die Stromversorgung geladen wird ist vernachlässigbar. Du kannst die Aktualisierungsrate also in den meisten Fällen maximieren, wenn das Gerät mit dem Internet verbunden ist. an eine Steckdose anschließen. Wenn sich das Gerät hingegen entlädt, hilft es, die Aktualisierungsrate zu reduzieren, um die Akkulaufzeit zu verlängern.

Außerdem können Sie den Akkustand prüfen und die Häufigkeit der Updates reduzieren oder sie sogar beenden, wenn der Akku fast leer ist.

Aktuellen Ladestatus ermitteln

Prüfen Sie zuerst den aktuellen Ladestatus. Das BatteryManager überträgt alle Akku- und Ladedetails in einem fixierten Intent, das Folgendes enthält: den Ladestatus.

Da es sich um eine persistente Intent handelt, müssen Sie keine BroadcastReceiver registrieren. Wenn Sie einfach registerReceiver aufrufen und null als Empfänger übergeben, wie im nächsten Snippet gezeigt, wird die Intent-Aktualisierung für den Akkustatus zurückgegeben. Du könntest hier ein tatsächliches BroadcastReceiver-Objekt übergeben, aber wir werden Aktualisierungen in einem späteren Abschnitt behandeln, sodass dies nicht erforderlich ist.

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

Du kannst sowohl den aktuellen Ladestatus abrufen als auch, wenn das Gerät geladen wird, wird über USB oder Wechselstrom aufgeladen:

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;

Normalerweise sollten Sie die Rate der Hintergrundaktualisierungen maximieren, wenn das Gerät an ein Netzteil angeschlossen ist. Reduzieren Sie die Rate, wenn das Gerät über USB geladen wird, und senken Sie sie noch weiter, wenn der Akku entladen wird.

Änderungen des Ladestatus überwachen

Der Ladestatus kann sich genauso leicht ändern, wie ein Gerät angeschlossen werden kann. Daher ist es wichtig, Überwachen Sie den Ladestatus auf Änderungen und ändern Sie die Aktualisierungsrate entsprechend.

Der BatteryManager sendet eine Aktion, wenn das Gerät an die Stromversorgung angeschlossen oder von ihr getrennt wird. Es ist wichtig, dass Sie diese Ereignisse auch dann erhalten, wenn Ihre App nicht aktiv ist. Insbesondere sollten diese Ereignisse sich darauf auswirken, wie oft Sie Ihre App starten, um ein Hintergrundupdate zu starten. Sie sollten daher in Ihrem Manifest eine BroadcastReceiver registrieren, um auf beide Ereignisse zu hören. Definieren Sie dazu ACTION_POWER_CONNECTED und ACTION_POWER_DISCONNECTED in einem Intent-Filter.

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

Aktuellen Akkustand ermitteln

In einigen Fällen ist es auch hilfreich, den aktuellen Akkuladestand zu ermitteln. Sie können die Häufigkeit der Hintergrundaktualisierungen reduzieren, wenn der Akkustand unter einen bestimmten Wert fällt.

Sie können den aktuellen Akkustand ermitteln, indem Sie den aktuellen Akkustand und die Skala aus der Intent-Aktion „battery_status“ extrahieren, wie hier gezeigt:

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;

Auf erhebliche Änderungen des Akkustands reagieren

Sie können den Akkustand nicht kontinuierlich überwachen, aber das ist auch nicht nötig.

Generell sind die Auswirkungen der Überwachung des Akkuladestands stärker. als das normale Verhalten Ihrer App hat. Die Registrierung einer BroadcastReceiver im Manifest, um bei niedrigem Akkustand ausstehende Arbeiten abzubrechen, dienen in erster Linie dazu, den Akku stärker zu entladen. unmöglich, weil Android 8.0) Stattdessen können Sie Einschränkungen für die Arbeit festlegen, die beschreiben, wann sie ausgeführt werden soll. So kann das System die Entscheidung treffen, ohne Energie für das Starten Ihrer App zu verschwenden.

Es ist generell empfehlenswert, die Hintergrundupdates nicht auszuführen, wenn der Akku geladen ist. extrem niedrig. Es spielt keine Rolle, wie aktuell Ihre Daten sind, wenn sich das Smartphone selbst ausschaltet, bevor Sie sie nutzen können. Verwenden Sie dazu die WorkManager-Bibliothek mit einer BatteryNotLow-Einschränkung, um anzugeben, dass die Arbeit nicht ausgeführt werden soll, wenn der Akkustand niedrig ist (zusätzlich zu allen relevanten NetworkType-Einschränkungen).

In vielen Fällen erfolgt das Aufladen eines Geräts zeitgleich mit der Nutzung des Geräts. in ein Dock setzen. Weitere Informationen finden Sie unter Bestimmen und Docking-Status und -Typ überwachen