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 inNetworkRequest
.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 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);