Netzwerkdatennutzung optimieren

Im Laufe der Lebensdauer eines Smartphones können die Kosten für einen Mobilfunk-Datentarif leicht die Kosten für das Gerät selbst übersteigen. Unter Android 7.0 (API-Level 24) und höher können Nutzer den Datensparmodus für das gesamte Gerät aktivieren, um die Datennutzung auf ihrem Gerät zu optimieren und weniger Daten zu verbrauchen. Dies ist besonders nützlich beim Roaming, kurz vor Ende des Abrechnungszeitraums, oder bei einem kleinen Prepaid-Datenpaket.

Wenn ein Nutzer den Datensparmodus in den Einstellungen aktiviert und sich das Gerät in einem kostenpflichtigen Netzwerk befindet, blockiert das System die Nutzung von Hintergrunddaten und weist Apps an, möglichst weniger Daten im Vordergrund zu verwenden. Nutzer können bestimmten Apps erlauben, im Hintergrund abgerechnete Datennutzung zu nutzen, auch wenn der Datensparmodus aktiviert ist.

Mit Android 7.0 (API-Level 24) wird die ConnectivityManager API erweitert. Sie bietet Apps die Möglichkeit, die Datenspareinstellungen des Nutzers abzurufen und Änderungen der Einstellungen im Blick zu behalten. Es gilt als empfehlenswert, Apps zu prüfen, ob der Nutzer den Datensparmodus aktiviert hat, und sich zu bemühen, die Nutzung von Daten im Vordergrund und im Hintergrund zu begrenzen.

Einstellungen für den Datensparmodus prüfen

Unter Android 7.0 (API-Level 24) und höher können Apps mithilfe der ConnectivityManager API feststellen, welche Datennutzungsbeschränkungen angewendet werden. 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 die Datensparfunktion für diese App aktiviert. Apps sollten sich bemühen, die Datennutzung im Vordergrund zu begrenzen und Einschränkungen der Nutzung von Hintergrunddaten ordnungsgemäß zu bewältigen.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
Der Nutzer hat den Datensparmodus aktiviert, die App darf ihn jedoch umgehen. Apps sollten dennoch versuchen, die Nutzung von Daten im Vorder- und Hintergrund einzuschränken.

Begrenzen Sie die Datennutzung, wenn das Gerät mit einem kostenpflichtigen 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 Anwendung verwenden soll:

Kotlin

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
    // 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.
    }
}

Java

ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
// Checks if the device is on a metered network
if (connMgr.isActiveNetworkMetered()) {
  // Checks user’s Data Saver settings.
  switch (connMgr.getRestrictBackgroundStatus()) {
    case RESTRICT_BACKGROUND_STATUS_ENABLED:
    // Background data usage is blocked for this app. Wherever possible,
    // the app should also use less data in the foreground.

    case 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.

    case 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:Dieses Verhalten ist bei Android TV anders. Anstatt die Hintergrundnutzung zu blockieren, drosselt Android TV sie nur. Anwendungen, die im Vordergrund ausgeführt werden, sind auf 800 kbit/s beschränkt, im Hintergrund auf 10 kbit/s. Mit ConnectivityManager.isActiveNetworkMetered() kannst du herausfinden, wann du die Datennutzung auf dem Fernseher beschränken solltest.

Berechtigungen zur Dateneinschränkung anfordern

Wenn Ihre App Daten im Hintergrund verwenden muss, kann sie Berechtigungen zur Dateneinschränkung anfordern. Dazu wird ein Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS-Intent gesendet, der einen URI des Paketnamens Ihrer App enthält, z. B. package:MY_APP_ID.

Wenn Sie den Intent und den URI senden, wird die App Einstellungen gestartet und die Einstellungen für die Datennutzung für Ihre App angezeigt. Der Nutzer kann dann entscheiden, ob er Hintergrunddaten für Ihre App aktivieren möchte. Bevor Sie den Intent senden, sollten Sie den Nutzer fragen, ob er die Einstellungen starten soll, um die Nutzung von Hintergrunddaten zu aktivieren.

Änderungen an den Datenspareinstellungen überwachen

Anwendungen können Änderungen an den Datenspareinstellungen überwachen. Dazu erstellen Sie einen BroadcastReceiver, der auf ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED lauscht, und registriert den Empfänger dynamisch mit Context.registerReceiver(). Wenn eine App diesen Broadcast empfängt, sollte sie durch Aufrufen von ConnectivityManager.getRestrictBackgroundStatus() prüfen, ob sich die neuen Datenspareinstellungen auf ihre Berechtigungen auswirken.

Hinweis:Das System sendet diesen Broadcast nur an Apps, die dynamisch mit Context.registerReceiver() dafür registriert werden. Apps, die in ihrem Manifest für den Empfang dieser Nachricht registriert sind, empfangen diese Nachrichten nicht.

Mit Android Debug Bridge-Befehlen testen

Android Debug Bridge (ADB) bietet einige Befehle, mit denen Sie Ihre App in Datensparbedingungen testen können. Sie können Netzwerkberechtigungen prüfen und konfigurieren oder WLANs als kostenpflichtig festlegen, um Ihre App in kostenlosen Netzwerken zu testen.

$ adb shell dumpsys netpolicy
Generiert einen Bericht mit der aktuellen globalen Einstellung für die Netzwerkeinschränkung im Hintergrund, Paket-UIDs, die derzeit den Datensparmodus umgehen dürfen, und die Netzwerkberechtigungen anderer bekannter Pakete.
$ adb shell cmd netpolicy
Zeigt eine vollständige Liste der Befehle des Netzwerkrichtlinienmanagers (netpolicy) an.
$ adb shell cmd netpolicy set restrict-background <boolean>
Aktiviert bzw. deaktiviert den Datensparmodus, wenn true bzw. false übergeben wird.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Fügt die angegebene Paket-UID der Zulassungsliste (whitelist) hinzu, um im Hintergrund gemessene Datennutzung zuzulassen.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
Entfernt die angegebene Paket-UID aus der Zulassungsliste (whitelist), um die im Hintergrund abgerechnete Datennutzung 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 WLAN mit der angegebenen SSID als kostenpflichtig fest, sodass Sie ein gebührenpflichtiges Netzwerk in einem kostenlosen Netzwerk simulieren können.