Cómo determinar y supervisar el estado de la conectividad

Algunos de los usos más comunes para las alarmas con repetición y los servicios en segundo plano son la programación de actualizaciones regulares de los datos de apps provenientes de recursos de Internet, el almacenamiento de datos en caché y la ejecución de descargas prolongadas. Pero si no tienes conexión a Internet, o si la conexión es muy lenta como para completar la descarga, ¿por qué molestarse en activar el dispositivo a fin de programar una descarga?

Puedes usar el ConnectivityManager para comprobar si realmente tienes conexión a Internet y, en ese caso, qué tipo de conexión está activa.

Cómo determinar si tienes conexión a Internet

No necesitas programar una actualización basada en un recurso de Internet si no tienes conexión. En el fragmento que aparece a continuación, se muestra cómo usar el ConnectivityManager para consultar la red activa y determinar si tiene conexión a Internet.

Kotlin

    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
    val isConnected: Boolean = activeNetwork?.isConnectedOrConnecting == true
    

Java

    ConnectivityManager cm =
            (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null &&
                          activeNetwork.isConnectedOrConnecting();
    

Cómo determinar el tipo de conexión a Internet

También puedes determinar el tipo de conexión a Internet que se encuentra disponible.

La conectividad del dispositivo puede ser a través de datos móviles, WiMAX, Wi-Fi y Ethernet. Al consultar el tipo de red activa, como se muestra a continuación, puedes modificar la frecuencia de actualización en función del ancho de banda disponible.

Kotlin

    val isWiFi: Boolean = activeNetwork?.type == ConnectivityManager.TYPE_WIFI
    

Java

    boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
    

El costo de las conexiones de datos móviles suele ser muy superior al de las conexiones Wi-Fi, por lo que en la mayoría de los casos, la frecuencia de actualización de tu app debería ser menor si utilizas conexiones móviles. Asimismo, las descargas grandes deberían suspenderse hasta que te conectes a una red Wi-Fi.

Cuando inhabilites las actualizaciones, es importante que detectes si hay cambios en la conectividad para poder reanudarlas cuando se haya restablecido la conexión a Internet.

Cómo supervisar los cambios en la conectividad

Las apps que se orientan a Android 7.0 (nivel de API 24) y versiones posteriores no reciben emisiones de CONNECTIVITY_ACTION si especifican el receptor de emisión en su manifiesto. De igual manera, las apps recibirán emisiones de CONNECTIVITY_ACTION si registran su BroadcastReceiver con el Context.registerReceiver() y ese contexto sigue siendo válido.