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

Le ConnectivityManager fournit une API qui vous permet de demander à l'appareil de se connecter à un réseau en fonction de diverses conditions, y compris les capacités de l'appareil et les options de transfert 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 capacité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, tel qu'une connexion Wi-Fi ou mobile, et les capacités du réseau actuellement connecté, telles qu'une connexion Internet, vous devez configurer une requête réseau.

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

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

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

Configurer un rappel réseau

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

Voici les fonctions les plus couramment implémentées dans NetworkCallback :

  • 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.

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

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 satisfait NetworkRequest. L'état est ensuite signalé au 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);