Während der Lebensdauer eines Smartphones können die Kosten für einen Tarif für mobile Daten die Kosten für das Gerät selbst übersteigen. Unter Android 7.0 (API-Level 24) und höher können Nutzer den Datensparmodus auf dem gesamten Gerät aktivieren, um die Datennutzung ihres Geräts zu optimieren und weniger Daten zu verbrauchen. Diese Funktion ist besonders nützlich beim Roaming, am Ende des Abrechnungszeitraums oder bei einem kleinen Prepaid-Datenpaket.
Wenn ein Nutzer den Datensparmodus in den Einstellungen aktiviert und das Gerät mit einem getakteten Netzwerk verbunden ist, blockiert das System die Hintergrunddatennutzung und signalisiert Apps, nach Möglichkeit weniger Daten im Vordergrund zu verwenden. Nutzer können bestimmten Apps erlauben, im Hintergrund getaktete Daten zu nutzen, auch wenn der Datensparmodus aktiviert ist.
Android 7.0 (API-Level 24) erweitert die ConnectivityManager-API, um Apps die Möglichkeit zu geben, die Einstellungen des Nutzers für den Datensparmodus abzurufen und Änderungen an den Einstellungen zu überwachen. Es gilt als Best Practice, dass Apps prüfen, ob der Nutzer den Datensparmodus aktiviert hat, und versuchen, die Datennutzung im Vorder- und Hintergrund zu begrenzen.
Einstellungen für den Datensparmodus prüfen
Unter Android 7.0 (API-Level 24) und höher können Apps die ConnectivityManager API verwenden, um zu ermitteln, welche Einschränkungen für die Datennutzung gelten. Die Methode getRestrictBackgroundStatus() gibt einen der folgenden Werte zurück:
-
RESTRICT_BACKGROUND_STATUS_DISABLED - Der Datensparmodus ist deaktiviert.
-
RESTRICT_BACKGROUND_STATUS_ENABLED - Der Nutzer hat den Datensparmodus für diese App aktiviert. Apps sollten versuchen, die Datennutzung im Vordergrund zu begrenzen und Einschränkungen bei der Datennutzung im Hintergrund ordnungsgemäß zu verarbeiten.
-
RESTRICT_BACKGROUND_STATUS_WHITELISTED - Der Nutzer hat den Datensparmodus aktiviert, aber die App darf ihn umgehen. Apps sollten dennoch versuchen, die Datennutzung im Vorder- und Hintergrund zu begrenzen.
Die Datennutzung wird eingeschränkt, wenn das Gerät mit einem getakteten Netzwerk verbunden ist, auch wenn der Datensparmodus deaktiviert ist oder die App ihn umgehen darf. Im folgenden Beispielcode werden ConnectivityManager.isActiveNetworkMetered() und ConnectivityManager.getRestrictBackgroundStatus() verwendet, um zu bestimmen, wie viele Daten die App verwenden soll:
with(getSystemService(ConnectivityManager::class.java)) { // Checks if the device is on a metered network. if (isActiveNetworkMetered) { // Checks user’s Data Saver settings. when (restrictBackgroundStatus) { RESTRICT_BACKGROUND_STATUS_ENABLED -> { // Background data usage is blocked for this app. Wherever possible, // the app should also use less data in the foreground. } RESTRICT_BACKGROUND_STATUS_WHITELISTED -> { // The app is allowed to bypass Data Saver. Nevertheless, wherever possible, // the app should use less data in the foreground and background. } RESTRICT_BACKGROUND_STATUS_DISABLED -> { // Data Saver is disabled. Since the device is connected to a // metered network, the app should use less data wherever possible. } } } else { // The device is not on a metered network. // Use data as required to perform syncs, downloads, and updates. } }
Hinweis: Auf Android TV ist das Verhalten anders. Anstatt die Hintergrundnutzung zu blockieren, wird sie von Android TV nur gedrosselt. Im Vordergrund sind Anwendungen auf 800 Kbit/s und im Hintergrund auf 10 Kbit/s beschränkt. Verwende ConnectivityManager.isActiveNetworkMetered(), um zu erkennen, wann die Datennutzung auf dem Fernseher eingeschränkt werden soll.
Berechtigungen für Dateneinschränkungen anfordern
Wenn Ihre App Daten im Hintergrund verwenden muss, kann sie eingeschränkte Berechtigungen anfordern. Dazu sendet sie einen Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS-Intent, der einen URI des Paketnamens Ihrer App enthält, z. B. package:MY_APP_ID.
Durch das Senden des Intents und des URI wird die App Einstellungen gestartet und die Einstellungen für die Datennutzung für Ihre App werden angezeigt. Der Nutzer kann dann entscheiden, ob er Hintergrunddaten für Ihre App aktivieren möchte. Bevor Sie diesen Intent senden, sollten Sie den Nutzer fragen, ob er die App Einstellungen starten möchte, um die Nutzung von Hintergrunddaten zu aktivieren.
Änderungen an den Einstellungen für den Datensparmodus im Blick behalten
Apps können Änderungen an den Einstellungen für den Datensparmodus überwachen, indem sie einen BroadcastReceiver erstellen, der auf ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED wartet, und den Empfänger dynamisch mit Context.registerReceiver() registrieren.
Wenn eine App diese Übertragung empfängt, sollte sie prüfen, ob sich die neuen Einstellungen für den Datensparmodus auf ihre Berechtigungen auswirken. Dazu muss sie ConnectivityManager.getRestrictBackgroundStatus() aufrufen.
Hinweis: Das System sendet diesen Broadcast nur an Apps, die sich dynamisch mit Context.registerReceiver() dafür registrieren.
Apps, die sich in ihrem Manifest für den Empfang dieses Broadcasts registrieren, erhalten ihn nicht.
Mit Android Debug Bridge-Befehlen testen
Die Android Debug Bridge (ADB) bietet einige Befehle, mit denen du deine App unter den Bedingungen des Datensparmodus testen kannst. Du kannst Netzwerkberechtigungen prüfen und konfigurieren oder drahtlose Netzwerke als kostenpflichtig festlegen, um deine App in Netzwerken ohne Datenlimit zu testen.
-
$ adb shell dumpsys netpolicy - Erstellt einen Bericht, der die aktuelle globale Einstellung für die Einschränkung von Hintergrundnetzwerken, Paket-UIDs, die den Datensparmodus derzeit umgehen dürfen, und die Netzwerkberechtigungen anderer bekannter Pakete enthält.
-
$ adb shell cmd netpolicy - Zeigt eine vollständige Liste der Network Policy Manager-Befehle (netpolicy) an.
-
$ adb shell cmd netpolicy set restrict-background <boolean> -
Aktiviert oder deaktiviert den Datensparmodus, wenn
truebzw.falseübergeben wird. -
$ adb shell cmd netpolicy add restrict-background-whitelist <UID> -
Fügt die angegebene Paket-UID der Zulassungsliste (
whitelist) hinzu, um die Nutzung von Hintergrunddaten bei getakteten Verbindungen zuzulassen. -
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID> -
Entfernt die angegebene Paket-UID aus der Zulassungsliste (
whitelist), um die Nutzung von getakteten Daten im Hintergrund zu blockieren, während der Datensparmodus aktiviert ist. -
$ adb shell cmd netpolicy list wifi-networks - Listet alle WLANs auf und zeigt an, ob sie kostenpflichtig sind.
-
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true - Legt das WLAN mit der angegebenen SSID als getaktet fest, sodass Sie ein getaktetes Netzwerk in einem Netzwerk ohne Datenlimit simulieren können.