Monitorare lo stato della connettività e la misurazione delle connessioni

Il ConnectivityManager fornisce un'API che ti consente di richiedere che il dispositivo si connetta a una rete in base varie condizioni, tra cui le funzionalità dei dispositivi e le opzioni di trasporto dei dati.

L'implementazione di callback fornisce alla tua app informazioni sugli lo stato della connessione e le funzionalità della connessione in ogni rete. L'API consente di determinare se il dispositivo è attualmente collegati a una rete che soddisfi i requisiti della tua app.

Configura una richiesta di rete

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

Dichiara un NetworkRequest che descrive le esigenze di connessione di rete della tua app. Il seguente codice crea un'istanza una rete connessa a internet che utilizzi una rete Wi-Fi o rete 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();

Si noti che alcune connessioni possono essere molto più costose di altre (ad esempio, una connessione mobile è generalmente costosa). Utilizza le funzionalità di NetworkCapabilities#NET_CAPABILITY_NOT_METERED per determinare se la connessione è costosa. Quando utilizzi una connessione a consumo, provare a ridurre il consumo di dati dell'app o a ritardarlo finché il dispositivo non dispone di un connessione a consumo.

Configura un callback di rete

Quando registri il NetworkRequest con il ConnectivityManager, devi implementare un NetworkCallback: per ricevere notifiche sui cambiamenti dello stato della connessione e della rete le funzionalità di machine learning.

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

  • onAvailable() indica che il dispositivo è connesso a una nuova rete che soddisfa le capacità di trasporto e requisiti relativi al tipo di trasporto specificati nella NetworkRequest.
  • onLost() indica che il dispositivo ha perso la connessione alla rete.
  • onCapabilitiesChanged() indica che le capacità della rete sono cambiate. La 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);
    }
};

Registrati per ricevere aggiornamenti di rete

Dopo aver dichiarato NetworkRequest e NetworkCallback, utilizza il metodo requestNetwork(): oppure registerNetworkCallback() per cercare una rete da connettere dal dispositivo che soddisfa la 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);