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.