Surveiller l'état de la connectivité et la mesure des connexions

ConnectivityManager fournit une API qui vous permet de demander à l'appareil de se connecter à un réseau en fonction de différentes conditions, y compris les fonctionnalités de l'appareil et les options de transport de données.

L'implémentation du rappel fournit à votre application des informations sur l'état de connexion de l'appareil, ainsi que sur les fonctionnalités du réseau actuellement connecté. L'API vous permet de déterminer si l'appareil est actuellement connecté à un réseau qui répond aux exigences de votre application.

Configurer une requête réseau

Pour spécifier le type de transport du réseau, comme une connexion Wi-Fi ou mobile, et les fonctionnalités du réseau actuellement connecté, comme la connexion Internet, vous devez configurer une requête réseau.

Déclarez un NetworkRequest qui décrit les besoins de connexion réseau de votre application. Le code suivant crée une requête pour un réseau connecté à Internet et utilise une connexion Wi-Fi, Ethernet ou une connexion au réseau mobile pour le type de transport.

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

Notez que certaines connexions peuvent être beaucoup plus coûteuses que d'autres (par exemple, une connexion mobile est généralement coûteuse). Utilisez NetworkCapabilities#NET_CAPABILITY_NOT_METERED pour déterminer si la connexion est coûteuse. Lorsque vous utilisez une connexion limitée, essayez de réduire la consommation de données de votre application ou de la retarder jusqu'à ce que l'appareil dispose d'une connexion illimitée.

Configurer un rappel réseau

Lorsque vous enregistrez le NetworkRequest avec le ConnectivityManager, vous devez implémenter un NetworkCallback pour recevoir des notifications sur les changements d'état de la connexion et des capacités du réseau.

Les fonctions les plus couramment implémentées dans NetworkCallback sont les suivantes :

  • onAvailable() indique que l'appareil est connecté à un nouveau réseau qui répond aux exigences de fonctionnalités et de type de transport spécifiées dans NetworkRequest.
  • onLost() indique que l'appareil a perdu la connexion au réseau.
  • onCapabilitiesChanged() indique que les capacités du réseau ont changé. L'objet NetworkCapabilities fournit des informations sur les capacités actuelles du réseau.

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        // Network is available for use.
    }

    // Network capabilities have changed for the network.
    override fun onCapabilitiesChanged(
        network: Network,
        networkCapabilities: NetworkCapabilities
    ) {
        val unmetered =
            networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
        if (!unmetered) {
            // Reduce data usage, or delay it until the network is unmetered.
        }
    }

    override fun onLost(network: Network) {
        // Lost network connection.
    }
}

S'inscrire pour recevoir des informations sur le réseau

Après avoir déclaré NetworkRequest et NetworkCallback, utilisez les fonctions requestNetwork() ou registerNetworkCallback() pour rechercher un réseau auquel se connecter à partir de l'appareil qui répond à NetworkRequest. L'état est ensuite signalé à NetworkCallback.

val connectivityManager = getSystemService(ConnectivityManager::class.java)
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)