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 dostarcza aplikacji informacje o jak również stan połączenia, a także możliwości Interfejs API pozwala określić, czy urządzenie 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 element NetworkRequest, który: opisuje potrzeby aplikacji w zakresie połączenia sieciowego. 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 od innych (na np. 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, ogranicz zużycie danych przez aplikację lub opóźnij je do czasu, gdy urządzenie będzie mieć połączenie bez limitu.

Skonfiguruj wywołanie zwrotne sieci

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

Najczęściej zaimplementowane 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() oznacza, że urządzenie utraciło połączenie z siecią.
  • onCapabilitiesChanged() wskazuje, że możliwości sieci uległy zmianie. NetworkCapabilities obiekt dostarcza informacji na temat bieżących możliwości 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ć, 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 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);