W ciągu całego okresu użytkowania telefonu koszt pakietu danych mobilnych może przekroczyć koszt samego urządzenia. Na urządzeniach z Androidem 7.0 (poziom interfejsu API 24) lub nowszym użytkownicy mogą włączyć Oszczędzanie danych na całym urządzeniu, aby zoptymalizować wykorzystanie danych i zużywać ich mniej. Ta funkcja jest szczególnie przydatna podczas korzystania z roamingu, pod koniec cyklu rozliczeniowego lub w przypadku niewielkiego pakietu danych przedpłaconych.
Gdy użytkownik włączy Oszczędzanie danych w Ustawieniach, a urządzenie jest połączone z siecią z pomiarem danych, system blokuje użycie danych w tle i sygnalizuje aplikacjom, aby w miarę możliwości używały mniej danych na pierwszym planie. Użytkownicy mogą zezwolić określonym aplikacjom na korzystanie z transmisji danych w tle, nawet gdy Oszczędzanie danych jest włączone.
Android 7.0 (interfejs API na poziomie 24) rozszerza interfejs API ConnectivityManager, aby umożliwić aplikacjom pobieranie ustawień oszczędzania danych użytkownika i monitorowanie zmian tych ustawień. Zgodnie z dobrymi praktykami aplikacje powinny sprawdzać, czy użytkownik włączył Oszczędzanie danych, i starać się ograniczać wykorzystanie danych na pierwszym planie i w tle.
Sprawdzanie ustawień oszczędzania danych
Na urządzeniach z Androidem 7.0 (poziom interfejsu API 24) lub nowszym aplikacje mogą używać interfejsu API ConnectivityManager, aby określić, jakie ograniczenia dotyczące wykorzystania danych są stosowane. Metoda getRestrictBackgroundStatus() zwraca jedną z tych wartości:
-
RESTRICT_BACKGROUND_STATUS_DISABLED - Oszczędzanie danych jest wyłączone.
-
RESTRICT_BACKGROUND_STATUS_ENABLED - Użytkownik włączył Oszczędzanie danych w tej aplikacji. Aplikacje powinny ograniczać wykorzystanie danych na pierwszym planie i odpowiednio obsługiwać ograniczenia dotyczące wykorzystania danych w tle.
-
RESTRICT_BACKGROUND_STATUS_WHITELISTED - Użytkownik włączył Oszczędzanie danych, ale aplikacja może je pomijać. Aplikacje powinny jednak starać się ograniczać wykorzystanie danych na pierwszym planie i w tle.
Ograniczaj wykorzystanie danych, gdy urządzenie jest połączone z siecią taryfową, nawet jeśli Oszczędzanie danych jest wyłączone lub aplikacja może je pomijać. Poniższy przykładowy kod używa ConnectivityManager.isActiveNetworkMetered() i ConnectivityManager.getRestrictBackgroundStatus(), aby określić, ile danych powinna używać aplikacja:
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. } }
Uwaga: na Androidzie TV działa to inaczej. Zamiast blokować użycie w tle, Android TV tylko je ogranicza. Gdy aplikacje działają na pierwszym planie, ich przepustowość jest ograniczona do 800 kb/s, a gdy działają w tle – do 10 kb/s. Użyj ConnectivityManager.isActiveNetworkMetered(), aby wykrywać, kiedy należy ograniczyć wykorzystanie danych na telewizorze.
Prośba o uprawnienia z ograniczeniami dotyczącymi danych
Jeśli aplikacja musi używać danych w tle, może poprosić o uprawnienia z ograniczeniami, wysyłając intencję Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS zawierającą identyfikator URI nazwy pakietu aplikacji, np. package:MY_APP_ID.
Wysłanie intencji i identyfikatora URI powoduje uruchomienie aplikacji Ustawienia i wyświetlenie ustawień użycia danych przez Twoją aplikację. Użytkownik może wtedy zdecydować, czy chce włączyć dane w tle dla Twojej aplikacji. Przed wysłaniem tej intencji warto najpierw zapytać użytkownika, czy chce uruchomić aplikację Ustawienia, aby włączyć użycie danych w tle.
Monitorowanie zmian w ustawieniach oszczędzania danych
Aplikacje mogą monitorować zmiany ustawień oszczędzania danych, tworząc obiekt BroadcastReceiver, który nasłuchuje ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED, i dynamicznie rejestrując odbiornik za pomocą Context.registerReceiver().
Gdy aplikacja otrzyma tę transmisję, powinna sprawdzić, czy nowe ustawienia Oszczędzania danych wpływają na jej uprawnienia, wywołując metodę ConnectivityManager.getRestrictBackgroundStatus().
Uwaga: system wysyła tę transmisję tylko do aplikacji, które dynamicznie rejestrują się w niej za pomocą Context.registerReceiver().
Aplikacje, które zarejestrują się w pliku manifestu, aby otrzymywać te komunikaty, nie będą ich otrzymywać.
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 warunkach oszczędzania danych. Możesz sprawdzić i skonfigurować uprawnienia sieciowe lub ustawić sieci bezprzewodowe jako sieci z pomiarem użycia danych, aby przetestować aplikację w sieciach bez pomiaru.
-
$ adb shell dumpsys netpolicy - Generuje raport zawierający bieżące globalne ustawienie ograniczenia sieci w tle, identyfikatory UID pakietów, które mogą obecnie pomijać Oszczędzanie danych, oraz uprawnienia sieciowe 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 lub wyłącza tryb oszczędzania danych, gdy przekazywana jest wartość
truelubfalse. -
$ adb shell cmd netpolicy add restrict-background-whitelist <UID> -
Dodaje określony identyfikator UID pakietu do listy dozwolonych (
whitelist), aby zezwolić na użycie danych w tle w połączeniu taryfowym. -
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID> -
Usuwa określony identyfikator UID pakietu z listy dozwolonych (
whitelist), aby zablokować użycie danych w tle, gdy włączone jest oszczędzanie danych. -
$ adb shell cmd netpolicy list wifi-networks - Wyświetla listę wszystkich sieci Wi-Fi i informację, czy są one taryfowe.
-
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true - Ustawia sieć Wi-Fi z określonym identyfikatorem SSID jako sieć z pomiarem użycia danych, co pozwala symulować sieć z pomiarem użycia danych w sieci bez pomiaru.