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

ConnectivityManager udostępnia interfejs API, który umożliwia wysyłanie do urządzenia żądań połączenia z siecią na podstawie różnych warunków, w tym możliwości urządzenia i opcji przesyłania danych.

Implementacja wywołania zwrotnego przekazuje do aplikacji informacje o stanie połączenia urządzenia oraz możliwościach aktualnie połączonej sieci. Interfejs API umożliwia sprawdzenie, 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.

zadeklarować NetworkRequest, które opisuje wymagania aplikacji dotyczące połączenia sieciowego. Poniższy kod tworzy żądanie sieci, która jest połączona z internetem i korzysta z połączenia Wi-Fi lub komórkowego jako typu transportu.

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 od innych (np. połączenie komórkowe jest zwykle drogie). Użyj NetworkCapabilities#NET_CAPABILITY_NOT_METERED aby określić, czy połączenie jest kosztowne. Gdy korzystasz z połączenia taryfowego, staraj się ograniczyć zużycie danych przez aplikację lub opóźnić je do momentu, gdy urządzenie będzie miało połączenie bez limitu.

Konfigurowanie wywołania zwrotnego sieci

Gdy zarejestrujesz NetworkRequestConnectivityManager, musisz wdrożyć NetworkCallback, aby otrzymywać powiadomienia o zmianach stanu połączenia i możliwości sieci.

Najczęściej wdrażane funkcje w NetworkCallback to:

  • onAvailable() oznacza, że urządzenie jest połączone z nową siecią, która spełnia wymagania dotyczące możliwości i typu transportu określone w NetworkRequest.
  • onLost() – oznacza, że urządzenie utraciło połączenie z siecią.
  • onCapabilitiesChanged() wskazuje, że możliwości sieci uległy zmianie. Obiekt NetworkCapabilities zawiera informacje 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);
    }
};

Rejestracja w celu otrzymywania aktualizacji sieci

Po zadeklarowaniu NetworkRequestNetworkCallback użyj funkcji requestNetwork() lub registerNetworkCallback() do wyszukania sieci, z którą można się połączyć z urządzenia, która spełnia wymagania NetworkRequest. Stan jest następnie zgłaszany 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);