Monitorare lo stato della connettività e la misurazione delle connessioni

ConnectivityManager fornisce un'API che ti consente di richiedere al dispositivo di connettersi 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 Wi-Fi o connessione cellulare, e le funzionalità della rete attualmente connessa, ad esempio la connessione a internet, devi configurare una richiesta di rete.

Dichiara un 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 o cellulare per il tipo di trasporto.

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

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 non a consumo.

Configurare un callback di rete

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

Le funzioni più comunemente implementate 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'oggetto NetworkCapabilities 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 funzioni requestNetwork() o registerNetworkCallback() per cercare una rete a cui connettersi dal dispositivo che soddisfi 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);