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 überprüfen.

Die Auswirkungen von App-Updates auf die Akkulaufzeit hängen vom Akkustand und vom Ladezustand des Geräts ab. Die Auswirkungen von Updates, die ausgeführt werden, während das Gerät über Wechselstrom geladen wird, sind vernachlässigbar. In den meisten Fällen können Sie die Bildwiederholrate maximieren, wenn das Gerät an ein Netzteil angeschlossen ist. Umgekehrt kann die Akkulaufzeit verlängert werden, wenn sich das Gerät entlädt, indem Sie die Aktualisierungsrate reduzieren.

Auf ähnliche Weise können Sie den Akkuladestand prüfen. Dadurch wird möglicherweise die Häufigkeit von Updates verringert oder sogar beendet, wenn der Akku fast erschöpft ist.

Aktuellen Ladestatus ermitteln

Prüfen Sie zuerst den aktuellen Ladestatus. Der BatteryManagerüberträgt alle Akku- und Ladedetails in einem fixierten Intent, der auch den Ladestatus enthält.

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 für den aktuellen 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, ob es über ein USB- oder Netzteil aufgeladen wird:

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, den Ladestatus auf Änderungen zu überwachen und die Aktualisierungsrate entsprechend anzupassen.

Der BatteryManager sendet eine Aktion, wenn das Gerät an die Stromversorgung angeschlossen oder von ihr getrennt wird. Es ist wichtig, diese Ereignisse auch dann zu empfangen, wenn deine App nicht ausgeführt wird. Vor allem, weil sich diese Ereignisse darauf auswirken sollten, wie oft du deine App startest, um ein Hintergrundupdate zu starten. Registriere ein BroadcastReceiver in deinem Manifest, um auf beide Ereignisse zu warten. 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 nützlich, den aktuellen Akkustand zu ermitteln. Sie können die Aktualisierungsrate im Hintergrund reduzieren, wenn der Akkuladestand unter einem bestimmten Wert liegt.

Sie können den aktuellen Akkustand ermitteln, indem Sie den aktuellen Akkustand extrahieren und wie hier gezeigt aus dem Intent für den Akkustatus skalieren:

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 Akkustatus nicht ohne Weiteres ständig überwachen, das ist aber nicht erforderlich.

Im Allgemeinen hat die Überwachung des Akkustands einen größeren Einfluss auf den Akku als das normale Verhalten Ihrer App. Wenn Sie beispielsweise im Manifest eine BroadcastReceiver registrieren, um ausstehende Aufgaben bei niedrigem Akkustand abzubrechen, wird der Akku dadurch hauptsächlich weiter entladen. Das ist seit Android 8.0 nicht mehr möglich. 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, Hintergrundupdates nicht auszuführen, wenn der Akkustand kritisch niedrig ist. 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 geschieht das Aufladen eines Geräts zusammen mit dem Einlegen in ein Dock. Weitere Informationen finden Sie unter Andockstatus und -typ ermitteln und überwachen.