Monitorowanie stanu połączeń i pomiaru wykorzystania połączenia

ConnectivityManager udostępnia interfejs API, który umożliwia żądanie 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. Pozwala on 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, np. połączenie Wi-Fi lub komórkowe, oraz możliwości aktualnie połączonej sieci (np. połączenie z internetem), musisz skonfigurować żądanie sieciowe.

Zadeklaruj obiekt NetworkRequest opisujący potrzeby aplikacji w zakresie połączenia sieciowego. Ten kod tworzy żądanie sieci połączonej z internetem i do tego celu używa połączenia Wi-Fi lub komórkowego.

Kotlin

val networkRequest = NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build()

Java

NetworkRequest networkRequest = new NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build();

Pamiętaj, że niektóre połączenia mogą być znacznie droższe niż inne (na przykład połączenie komórkowe jest zwykle kosztowne). Użyj parametru NetworkCapabilities#NET_CAPABILITY_NOT_METERED, aby określić, czy połączenie jest drogie. W przypadku połączenia z pomiarem użycia danych spróbuj ograniczyć zużycie danych przez aplikację lub opóźnij je do momentu, aż urządzenie nawiąże połączenie bez pomiaru.

Skonfiguruj wywołanie zwrotne sieci

Gdy rejestrujesz NetworkRequest za pomocą ConnectivityManager, musisz zaimplementować NetworkCallback, aby otrzymywać powiadomienia o zmianach stanu połączenia i możliwości sieci.

NetworkCallback zawiera najczęściej implementowane funkcje:

  • onAvailable() wskazuje, że urządzenie jest podłączone do nowej sieci, która spełnia wymagania dotyczące możliwości i typu transportu określone w dokumencie NetworkRequest.
  • onLost() oznacza, że urządzenie utraciło połączenie z siecią.
  • onCapabilitiesChanged() wskazuje, że możliwości sieci uległy zmianie. Obiekt NetworkCapabilities dostarcza informacji o bieżących możliwościach sieci.

Kotlin

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
    // network is available for use
    override fun onAvailable(network: Network) {
        super.onAvailable(network)
    }

    // Network capabilities have changed for the network
    override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
    ) {
        super.onCapabilitiesChanged(network, networkCapabilities)
        val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
    }

    // lost network connection
    override fun onLost(network: Network) {
        super.onLost(network)
    }
}

Java

private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
    }

    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
    }

    @Override
    public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
        super.onCapabilitiesChanged(network, networkCapabilities);
        final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
    }
};

Zarejestruj się, aby otrzymywać aktualizacje sieci

Po zadeklarowaniu parametrów NetworkRequest i NetworkCallback użyj funkcji requestNetwork() lub registerNetworkCallback(), aby wyszukać sieć, z której chcesz połączyć się z urządzenia, które spełnia NetworkRequest. Stan jest następnie przesyłany do NetworkCallback.

Kotlin

val connectivityManager = getSystemService(ConnectivityManager::class.java) as ConnectivityManager
connectivityManager.requestNetwork(networkRequest, networkCallback)

Java

ConnectivityManager connectivityManager =
        (ConnectivityManager) getSystemService(ConnectivityManager.class);
connectivityManager.requestNetwork(networkRequest, networkCallback);