Optymalizowanie wykorzystania transmisji danych w sieci

Koszt abonamentu na komórkową transmisję danych w miarę eksploatacji smartfona może się okazać przewyższa koszt samego urządzenia. Na Androidzie 7.0 (poziom interfejsu API 24) i użytkownicy mogą włączyć Oszczędzanie danych na całym urządzeniu, zoptymalizować użycie danych i zużywać mniej danych. Ta umiejętność przydaje się zwłaszcza w roamingu pod koniec cyklu rozliczeniowego. lub mały przedpłacony pakiet danych.

Gdy użytkownik włączy Oszczędzanie danych w Ustawieniach, a urządzenie zostanie w sieci z pomiarem użycia danych system blokuje przesyłanie danych w tle i sygnały aby aplikacje zużywały mniej danych na pierwszym planie, gdy tylko jest to możliwe. Użytkownicy mogą zezwalaj określonym aplikacjom na korzystanie z transmisji danych w tle z pomiarem użycia danych, nawet jeśli Oszczędzanie jest włączone.

Android 7.0 (poziom interfejsu API 24) rozszerza ConnectivityManager Interfejs API umożliwiający aplikacjom pobieranie danych użytkownika Ustawienia oszczędzania i preferencje monitorowania zmian. Zalecaną praktyką dla aplikacji jest sprawdzanie, czy włączył Oszczędzanie danych i starał się ograniczyć i użycie danych w tle.

Sprawdzanie ustawień oszczędzania danych

W Androidzie 7.0 (poziom interfejsu API 24) i nowszych aplikacje mogą używać Interfejs API ConnectivityManager w celu określenia, jakie ograniczenia użytkowania danych są stosowane. getRestrictBackgroundStatus() zwraca jedną z następujących wartości:

RESTRICT_BACKGROUND_STATUS_DISABLED
Oszczędzanie danych jest wyłączone.
RESTRICT_BACKGROUND_STATUS_ENABLED
Użytkownik włączył w tej aplikacji Oszczędzanie danych. Aplikacje powinny ograniczać ilość danych wykorzystanie na pierwszym planie i płynnie radzi sobie z ograniczeniami w tle. transmisji danych.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
Użytkownik włączył Oszczędzanie danych, ale aplikacja może je pominąć. Aplikacje nadal powinny starać się ograniczać użycie danych na pierwszym planie i w tle.

Ograniczaj użycie danych, gdy urządzenie jest podłączone do sieci z pomiarem użycia danych, nawet jeśli Oszczędzanie danych jest włączone jest wyłączona lub aplikacja może go ominąć. Następujący przykładowy kod korzysta z: ConnectivityManager.isActiveNetworkMetered() i ConnectivityManager.getRestrictBackgroundStatus(), aby określić ilość danych aplikacja powinna używać:

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

Uwaga: w przypadku Androida TV działa to inaczej. Zamiast Blokując dostęp w tle, Android TV ogranicza tę liczbę. W strefie na pierwszym planie aplikacje są ograniczone do 800 Kb/s, a gdy działają w tle, ograniczenie do 10 Kb/s. Używaj ConnectivityManager.isActiveNetworkMetered(), aby wykryć, kiedy należy i ograniczaj transmisję danych na telewizorze.

Poproś o uprawnienia do ograniczenia dostępu do danych

Jeśli aplikacja potrzebuje danych w tle, może prosić o te dane możesz ograniczyć uprawnienia, wysyłając wiadomość Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS intencja zawierająca identyfikator URI nazwy pakietu aplikacji: na przykład package:MY_APP_ID

Wysłanie intencji i identyfikatora URI powoduje uruchomienie aplikacji Settings (Ustawienia) oraz wyświetla ustawienia użycia danych przez aplikację. Użytkownik może wtedy zdecydować, czy aby włączyć dane w tle dla aplikacji. Przed wysłaniem intencji warto najpierw zapytać użytkownika, czy chce uruchomić Ustawienia. i ich wykorzystaniu.

Monitorowanie zmian w ustawieniach oszczędzania danych

Aplikacje mogą monitorować zmiany w ustawieniach Oszczędzania danych, tworząc BroadcastReceiver do nasłuchuj przez ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED i dynamicznie rejestrując odbiornik w Context.registerReceiver() Gdy aplikacja otrzyma tę transmisję, powinna sprawdzić, czy nowe Oszczędzanie danych ustawienia wpływają na jego uprawnienia, wywołując ConnectivityManager.getRestrictBackgroundStatus()

Uwaga: system wysyła ten komunikat tylko do aplikacji, które dynamicznie rejestrują się im z Context.registerReceiver() Aplikacje, które mają w swoim manifeście dostęp do tej transmisji, nie otrzymają jej.

Testowanie za pomocą poleceń Android Debug Bridge

Android Debug Bridge (ADB) udostępnia kilka poleceń, których możesz użyć do przetestowania aplikacji w Oszczędzaniu danych warunków. Możesz sprawdzić i skonfigurować sieć lub ustaw sieci bezprzewodowe jako z pomiarem użycia danych, aby przetestować aplikację sieci.

$ adb shell dumpsys netpolicy
Generuje raport, który uwzględnia bieżącą globalną sieć w tle UID w pakietach, które mogą omijać zabezpieczenia Oszczędzania danych, oraz uprawnień sieciowych innych znanych pakietów.
$ adb shell cmd netpolicy
Wyświetla pełną listę poleceń menedżera zasad sieciowych (netpolicy).
$ adb shell cmd netpolicy set restrict-background <boolean>
Włącza i wyłącza tryb Oszczędzanie danych po przekroczeniu progu true lub false.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Dodaje określony identyfikator UID pakietu do listy dozwolonych (whitelist), aby umożliwić działanie w tle z pomiarem użycia danych.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
Usuwa określony identyfikator UID pakietu z listy dozwolonych (whitelist) do zablokowania z pomiarem użycia danych w tle, gdy włączone jest Oszczędzanie danych.
$ adb shell cmd netpolicy list wifi-networks
Wyświetla listę wszystkich sieci Wi-Fi wraz z informacją, czy są one używane z pomiarem użycia danych.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
Ustawia sieć Wi-Fi o określonym identyfikatorze SSID jako z pomiarem użycia danych, co pozwala symulować z pomiarem użycia danych w sieci bez pomiaru.