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 przesyłania danych.

Implementacja wywołania zwrotnego przekazuje aplikacji informacje o stanie połączenia urządzenia oraz możliwościach aktualnie połączonej sieci. Interfejs API umożliwia określenie, 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 obecnie połączonej sieci, np. połączenie z internetem, musisz skonfigurować żądanie sieci.

Zadeklaruj NetworkRequest, który opisuje wymagania dotyczące połączenia z internetem w aplikacji. Poniższy kod tworzy żądanie dotyczące sieci połączonej z internetem i korzystającej z 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 drogie). Aby sprawdzić, czy połączenie jest drogie, użyj NetworkCapabilities#NET_CAPABILITY_NOT_METERED. Jeśli korzystasz z połączenia z ograniczonym transferem danych, spróbuj ograniczyć zużycie danych przez aplikację lub opóźnić je do czasu, gdy urządzenie będzie mieć połączenie bez limitu.

Konfigurowanie wywołania zwrotnego sieci

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

Najczęściej stosowane 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 w dokumentacji NetworkRequest.
  • onLost() wskazuje, że urządzenie utraciło połączenie z siecią.
  • onCapabilitiesChanged() wskazuje, że możliwości sieci uległy zmianie. Obiekt NetworkCapabilities zawiera informacje o obecnych 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 powiadomień o zmianach w sieci

Po zadeklarowaniu NetworkRequestNetworkCallback użyj funkcji requestNetwork() lub registerNetworkCallback(), aby wyszukać sieć do połączenia z urządzenia, która spełnia kryterium NetworkRequest. Stan jest następnie przekazywany 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);