Cómo supervisar el estado de conectividad y la medición de la conexión

ConnectivityManager proporciona una API que te permite solicitar que el dispositivo se conecte a una red en función de diversas condiciones, como las capacidades del dispositivo y las opciones de transporte de datos.

La implementación de la devolución de llamada proporciona a tu app información sobre el estado de conexión del dispositivo y las capacidades de la red conectada actualmente. La API te permite determinar si el dispositivo está conectado actualmente a una red que cumple con los requisitos de tu app.

Configura una solicitud de red

Para especificar el tipo de transporte de la red, como una conexión Wi-Fi o móvil, y las capacidades de la red conectada actualmente, como la conexión a Internet, debes configurar una solicitud de red.

Declara un NetworkRequest que describa las necesidades de conexión de red de tu app. El siguiente código crea una solicitud de una red conectada a Internet y usa una conexión Wi-Fi o móvil para el tipo de transporte.

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

Ten en cuenta que algunas conexiones pueden ser mucho más costosas que otras (por ejemplo, una conexión móvil suele ser costosa). Usa NetworkCapabilities#NET_CAPABILITY_NOT_METERED para determinar si la conexión es costosa. Cuando usas una conexión de uso medido, intenta reducir el consumo de datos de tu app o demorarlo hasta que el dispositivo tenga una conexión de uso no medido.

Cómo configurar una devolución de llamada de red

Cuando registras el NetworkRequest con el ConnectivityManager, debes implementar un NetworkCallback para recibir notificaciones sobre los cambios en el estado de la conexión y las capacidades de la red.

Entre las funciones que se implementan con mayor frecuencia en NetworkCallback, se incluyen las siguientes:

  • onAvailable() indica que el dispositivo está conectado a una red nueva que cumple con las capacidades y los requisitos de tipo de transporte especificados en NetworkRequest.
  • onLost(): Indica que el dispositivo perdió conexión con la red.
  • onCapabilitiesChanged() indica que cambiaron las capacidades de la red. El objeto NetworkCapabilities proporciona información sobre las capacidades actuales de la red.

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

Cómo registrarse para recibir actualizaciones de red

Después de declarar NetworkRequest y NetworkCallback, usa las funciones requestNetwork() o registerNetworkCallback() para buscar una red y conectarte desde el dispositivo que cumpla con NetworkRequest. Luego, el estado se informa 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);