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. 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 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. 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 (np. połączenie komórkowe jest zwykle drogie). Aby sprawdzić, czy połączenie jest drogie, użyj NetworkCapabilities#NET_CAPABILITY_NOT_METERED. 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.

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 na to, ż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);
    }
};

Rejestrowanie się, aby otrzymywać aktualizacje dotyczące sieci

Po zadeklarowaniu NetworkRequestNetworkCallback użyj funkcji requestNetwork() lub registerNetworkCallback(), aby wyszukać sieć, z którą urządzenie może się połączyć, i sprawdzić, czy spełnia ona kryteria określone w definicji 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);