Akku- und Ladestatus überwachen

Wenn du die Häufigkeit der Hintergrundupdates änderst, um die Auswirkungen dieser Updates auf die Akkulaufzeit zu verringern, solltest du den aktuellen Akkustand und den Ladestatus überprüfen.

Wie sich App-Updates auf die Akkulaufzeit auswirken, hängt vom Akkustand und vom Ladestatus des Geräts ab. Die Auswirkungen von Updates, während das Gerät über Wechselstrom geladen wird, ist minimal. Daher kannst du in den meisten Fällen die Aktualisierungsrate maximieren, wenn das Gerät an eine Wandsteckdose angeschlossen ist. Wenn das Gerät hingegen entlädt, kann die Verringerung der Aktualisierungsrate dazu beitragen, die Akkulaufzeit zu verlängern.

Ebenso können Sie den Akkustand prüfen und so möglicherweise die Häufigkeit von Updates reduzieren oder sogar stoppen, wenn der Akku fast leer ist.

Aktuellen Ladestatus ermitteln

Bestimmen Sie zuerst den aktuellen Ladestatus. Die BatteryManager überträgt alle Akku- und Ladedetails in einer fixierten Intent, die den Ladestatus enthält.

Da es sich um einen fixierten Intent handelt, müssen Sie keinen BroadcastReceiver registrieren. Dazu rufen Sie einfach registerReceiver auf und übergeben null als Empfänger, wie im nächsten Snippet gezeigt. Der aktuelle Intent für den Akkustatus wird zurückgegeben. Hier könnten Sie ein echtes BroadcastReceiver-Objekt übergeben. Aktualisierungen werden jedoch später behandelt, 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 ein AC-Ladegerät geladen 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, die Geschwindigkeit reduzieren, wenn der Akku über USB geladen wird, und die Geschwindigkeit weiter senken, wenn der Akku entlädt.

Änderungen des Ladestatus beobachten

Der Ladestatus kann sich so leicht ändern, wie ein Gerät angeschlossen werden kann. Daher ist es wichtig, den Ladestatus auf Veränderungen im Blick zu behalten und die Aktualisierungsrate entsprechend anzupassen.

Der BatteryManager sendet eine Aktion, wenn das Gerät angeschlossen oder von der Stromversorgung getrennt wird. Es ist wichtig, diese Ereignisse auch dann zu empfangen, wenn Ihre App nicht ausgeführt wird. Insbesondere da sich diese Ereignisse darauf auswirken, wie oft Sie Ihre App starten, um eine Aktualisierung im Hintergrund zu starten. Daher sollten Sie in Ihrem Manifest eine BroadcastReceiver registrieren, um auf beide Ereignisse zu warten. Dazu definieren Sie 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 bestimmen. Sie können die Rate der Hintergrundaktualisierungen reduzieren, wenn der Akkuladestand unter einem bestimmten Wert liegt.

Sie können den aktuellen Akkuladestand ermitteln, indem Sie den aktuellen Akkustand und die Skalierung aus dem Akkustatus-Intent 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 signifikante Änderungen des Batteriestands reagieren

Es ist nicht so einfach, den Akkustand kontinuierlich zu überprüfen, aber das ist nicht zwingend erforderlich.

Generell wirkt sich die Überwachung des Akkuladestands stärker auf den Akku aus als das normale Verhalten deiner App. Wenn Sie beispielsweise im Manifest eine BroadcastReceiver registrieren, um ausstehende Arbeiten bei niedrigem Akkustand abzubrechen, wird der Akku hauptsächlich entladen. Dies ist daher seit Android 8.0 nicht möglich. Stattdessen können Sie Beschränkungen für die Arbeit vorgeben, die beschreiben, wann die Anwendung ausgeführt werden sollte. So kann das System eine Entscheidung treffen, ohne Energie beim Starten der Anwendung zu verbrauchen.

Im Allgemeinen empfiehlt es sich, die Hintergrundupdates nicht auszuführen, wenn der Akkustand sehr niedrig ist. Es spielt keine Rolle, wie aktuell Ihre Daten sind, wenn sich das Telefon automatisch ausschaltet, bevor Sie sie verwenden können. Verwenden Sie dazu die WorkManager-Bibliothek mit der Einschränkung BatteryNotLow, um anzugeben, dass die Arbeit bei niedrigem Akkustand nicht ausgeführt werden soll (zusätzlich zu allen relevanten NetworkType-Einschränkungen).

In vielen Fällen erfolgt das Laden eines Geräts mit dem Laden in einem Dock. In der nächsten Lektion erfahren Sie, wie Sie den aktuellen Dock-Status ermitteln und auf Änderungen bei der Geräte-Dockingstation überwachen.