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

ConnectivityManager proporciona una API que permite solicitar que el dispositivo se conecte a una red según que incluyen capacidades del dispositivo y opciones de transporte de datos.

La implementación de devolución de llamada proporciona información a tu app sobre la función el estado de conexión y las capacidades de la red en cada red. La API permite determinar si el dispositivo está estar conectada a una red que cumpla con los requisitos de tu app.

Cómo configurar una solicitud de red

Para especificar el tipo de transporte de la red, como Wi-Fi o celular y las capacidades de la red conectada actualmente, como debes configurar una solicitud de red.

Declara un NetworkRequest que describe las necesidades de conexión de red de tu app. El siguiente código crea un solicitud de una red que esté conectada a Internet y use Wi-Fi o una conexión 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, reducir el consumo de datos de tu app o retrasarlo hasta que el dispositivo tenga de uso no medido.

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

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

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

  • onAvailable() indica que el dispositivo está conectado a una nueva red que cumple con la las capacidades y los requisitos de tipo de transporte especificados en el NetworkRequest.
  • onLost() indica que el dispositivo perdió la conexión con la red.
  • onCapabilitiesChanged() indica que las capacidades de la red cambiaron. 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);
    }
};

Regístrate para recibir actualizaciones de red

Después de declarar NetworkRequest y NetworkCallback, usa el requestNetwork() o registerNetworkCallback() para buscar una red para conectarse desde el dispositivo que cumpla con la 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);