PNO-Scans (Preferred Network Offload) sind WLAN-Scans mit geringem Stromverbrauch, die in regelmäßigen Abständen durchgeführt werden, wenn ein Gerät nicht mit einem WLAN verbunden ist und das Display ausgeschaltet ist. PNO-Scans werden verwendet, um gespeicherte Netzwerke zu finden und eine Verbindung zu ihnen herzustellen. Diese Scans werden vom Framework mit dem Befehl NL80211_CMD_START_SCHED_SCAN
geplant. Weitere Informationen finden Sie unter nl80211.h.
Stromverbrauch mit Informationen zur Gerätemobilität optimieren
Auf Geräten mit Android 9 oder niedriger werden PNO-Scans, wenn das Gerät vom WLAN getrennt ist und das Display ausgeschaltet ist, bei den ersten drei Scans alle 20 Sekunden durchgeführt. Danach wird die Häufigkeit auf einen Scan alle 60 Sekunden reduziert. Die PNO-Suche wird beendet, wenn ein gespeichertes Netzwerk gefunden wird oder das Display eingeschaltet wird.
In Android 10 wird in WifiManager
eine optionale API-Methode namens setDeviceMobilityState()
eingeführt, die das Intervall zwischen PNO-Scans basierend auf dem Mobilitätsstatus des Geräts verlängert, um den Stromverbrauch zu senken.
Folgende Mobilitätsstatus sind möglich:
DEVICE_MOBILITY_STATE_UNKNOWN
: Unbekannte MobilitätDEVICE_MOBILITY_STATE_HIGH_MVMT
: Mit dem Fahrrad oder im AutoDEVICE_MOBILITY_STATE_LOW_MVMT
: Gehen oder LaufenDEVICE_MOBILITY_STATE_STATIONARY
: Nicht in Bewegung
Wenn das Gerät nicht bewegt wird, erhöht das Android-Framework das Intervall zwischen PNO-Scans von 60 Sekunden auf 180 Sekunden, um den Stromverbrauch zu senken. Diese Optimierung basiert auf der Annahme, dass das Gerät bei PNO-Scans wahrscheinlich keine neuen Netzwerke findet, wenn es sich nicht bewegt.
Wenn sich das Gerät in einem anderen Mobilitätsstatus befindet oder die Methode nicht aufgerufen wird, verwendet das Gerät das standardmäßige PNO-Scanverhalten.
Implementierung
Wenn Sie diese Funktion zur Optimierung des Energieverbrauchs auf einem Gerät mit Android 10 oder höher implementieren möchten, leiten Sie die Informationen zur Gerätemobilität ab und rufen Sie die Methode setDeviceMobilityState()
über eine benutzerdefinierte System-App auf.