Monitorare lo stato della connettività e la misurazione delle connessioni

The ConnectivityManager fornisce un'API che ti consente di richiedere che il dispositivo si connetta a una rete in base a varie condizioni che includono le funzionalità del dispositivo e le opzioni di trasporto dei dati.

L'implementazione del callback fornisce alla tua app informazioni sullo stato della connessione del dispositivo e sulle funzionalità della rete attualmente connessa. L'API ti consente di determinare se il dispositivo è attualmente connesso a una rete che soddisfa i requisiti della tua app.

Configurare una richiesta di rete

Per specificare il tipo di trasporto della rete, ad esempio la connessione Wi-Fi o cellulare e le funzionalità della rete attualmente connessa, ad esempio la connessione a internet devi configurare una richiesta di rete.

Dichiara una NetworkRequest che descriva le esigenze di connessione di rete della tua app. Il seguente codice crea una richiesta per una rete connessa a internet e utilizza una connessione Wi-Fi, Ethernet o cellulare per il tipo di trasporto.

Kotlin

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

Java

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

Tieni presente che alcune connessioni possono essere molto più costose di altre (ad esempio, una connessione mobile è in genere costosa). Utilizza NetworkCapabilities#NET_CAPABILITY_NOT_METERED per determinare se la connessione è costosa. Quando utilizzi una connessione a consumo, prova a ridurre il consumo di dati dell'app o a rimandarlo a quando il dispositivo avrà una connessione illimitata.

Configurare un callback di rete

Quando registri NetworkRequest con ConnectivityManager, devi implementare un NetworkCallback per ricevere notifiche sulle modifiche dello stato della connessione e delle funzionalità di rete.

Le funzioni implementate più comunemente in NetworkCallback includono le seguenti:

  • onAvailable() indica che il dispositivo è connesso a una nuova rete che soddisfa i requisiti di funzionalità e tipo di trasporto specificati in NetworkRequest.
  • onLost() indica che il dispositivo ha perso la connessione alla rete.
  • onCapabilitiesChanged() indica che le funzionalità della rete sono cambiate. L' oggettoNetworkCapabilities fornisce informazioni sulle funzionalità attuali della rete.

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);
    }
};

Registrarsi per ricevere aggiornamenti sulla rete

Dopo aver dichiarato NetworkRequest e NetworkCallback, utilizza le requestNetwork() o registerNetworkCallback() funzioni per cercare una rete a cui connetterti dal dispositivo che soddisfi le NetworkRequest. Lo stato viene quindi segnalato a 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);