ConnectivityManager udostępnia interfejs API, który umożliwia wysyłanie żądań połączenia urządzenia z siecią na podstawie różnych warunków, w tym możliwości urządzenia i opcji transportu danych.
Implementacja wywołania zwrotnego dostarcza aplikacji informacje o stanie połączenia urządzenia oraz o możliwościach aktualnie połączonej sieci. Interfejs API pozwala określić, czy urządzenie jest obecnie połączone z siecią, która spełnia wymagania aplikacji.
Konfigurowanie żądania sieciowego
Aby określić typ transportu sieci, np. Wi-Fi lub połączenie komórkowe, oraz możliwości aktualnie połączonej sieci, np. połączenie z internetem, musisz skonfigurować żądanie sieciowe.
Zadeklaruj element NetworkRequest, który opisuje wymagania aplikacji dotyczące połączenia sieciowego. Poniższy kod tworzy żądanie dotyczące sieci połączonej z internetem, która jako typ transportu wykorzystuje Wi-Fi, Ethernet lub połączenie komórkowe.
private val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build()
Pamiętaj, że niektóre połączenia mogą być znacznie droższe od innych (na przykład połączenie komórkowe jest zwykle drogie). Użyj NetworkCapabilities#NET_CAPABILITY_NOT_METERED, aby określić, czy połączenie jest kosztowne. Jeśli połączenie jest połączeniem z pomiarem użycia danych, spróbuj zmniejszyć zużycie danych przez aplikację lub opóźnić je do czasu, gdy urządzenie będzie miało połączenie bez pomiaru użycia danych.
Konfigurowanie wywołania zwrotnego sieci
Gdy rejestrujesz NetworkRequest za pomocą ConnectivityManager, musisz zaimplementować NetworkCallback, aby otrzymywać powiadomienia o zmianach stanu połączenia i możliwościach sieci.
Najczęściej implementowane funkcje w NetworkCallback to:
onAvailable()wskazuje, że urządzenie jest połączone z nową siecią, która spełnia wymagania dotyczące możliwości i typu transportu określone wNetworkRequest.onLost()oznacza, że urządzenie utraciło połączenie z siecią.onCapabilitiesChanged()wskazuje, że możliwości sieci uległy zmianie. ObiektNetworkCapabilitiesdostarcza informacji o bieżących możliwościach sieci.
private val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { // Network is available for use. } // Network capabilities have changed for the network. override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) if (!unmetered) { // Reduce data usage, or delay it until the network is unmetered. } } override fun onLost(network: Network) { // Lost network connection. } }
Rejestrowanie się w celu otrzymywania aktualizacji sieci
Po zadeklarowaniu NetworkRequest i NetworkCallback użyj funkcji requestNetwork() lub registerNetworkCallback(), aby wyszukać sieć, z którą chcesz się połączyć z urządzenia spełniającego NetworkRequest. Stan jest następnie zgłaszany do NetworkCallback.
val connectivityManager = getSystemService(ConnectivityManager::class.java) connectivityManager.registerNetworkCallback(networkRequest, networkCallback)