Cómo modificar los patrones de descarga según el tipo de conectividad

Cuando se trata del impacto en la duración de la batería, no todos los tipos de conexión se crean de la misma manera. La radio Wi-Fi no solo consume mucho menos batería que sus equivalentes de radio inalámbrica, sino que las que se usan en las distintas tecnologías de radio inalámbrica tienen diferentes consecuencias.

Cómo usar Wi-Fi

En la mayoría de los casos, una radio Wi-Fi ofrecerá un mayor ancho de banda a un costo de batería mucho menor. Por lo tanto, siempre que sea posible, intenta realizar transferencias de datos cuando estés conectado mediante Wi-Fi.

Puedes utilizar un receptor de emisión para escuchar los cambios de conectividad que se indican cuando se establece una conexión Wi-Fi con el fin de ejecutar descargas importantes, interrumpir actualizaciones programadas y posiblemente aumentar de forma temporal la frecuencia de las actualizaciones regulares, como se describe en la lección Cómo determinar y supervisar el estado de conectividad de Cómo optimizar la duración de la batería.

Cómo usar mayor ancho de banda para descargar más datos con menos frecuencia

En una conexión mediante una radio inalámbrica, se puede obtener un mayor ancho de banda con un mayor uso de la batería. Esto significa que, por lo general, LTE consume más energía que 3G, lo que a su vez es más costoso que 2G.

Por lo tanto, mientras la máquina de estado de radio subyacente varía según la tecnología, en general, el impacto relativo de la batería del tiempo de cola de cambio de estado es mayor para radios que tienen un ancho de banda superior.

Al mismo tiempo, un mayor ancho de banda significa que puedes hacer precargas de forma más activa, y descargar más datos al mismo tiempo. Quizás de manera menos intuitiva, debido a que el costo de la batería del tiempo de cola es relativamente más alto, también es más eficiente mantener la radio activa durante períodos más largos en cada sesión de transferencia, con el fin de reducir la frecuencia de las actualizaciones.

Por ejemplo, si una radio LTE tiene el doble de ancho de banda y costo de energía de 3G, deberás descargar 4 veces más datos durante cada sesión, o hasta 10 MB. Cuando descargues esa cantidad de datos, es importante tener en cuenta el efecto de la precarga en el almacenamiento local disponible y vaciar la caché de precarga de forma regular.

Puedes usar el administrador de conectividad para determinar la radio inalámbrica activa y modificar las rutinas de precarga en consecuencia:

Kotlin

    val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    val tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

    val activeNetwork: NetworkInfo? = cm.activeNetworkInfo

    val prefetchCacheSize: Int = when (activeNetwork?.type) {
        ConnectivityManager.TYPE_WIFI -> MAX_PREFETCH_CACHE
        ConnectivityManager.TYPE_MOBILE -> {
            when (tm.networkType) {
                TelephonyManager.NETWORK_TYPE_LTE or TelephonyManager.NETWORK_TYPE_HSPAP ->
                    DEFAULT_PREFETCH_CACHE * 4
                TelephonyManager.NETWORK_TYPE_EDGE or TelephonyManager.NETWORK_TYPE_GPRS ->
                    DEFAULT_PREFETCH_CACHE / 2
                else -> DEFAULT_PREFETCH_CACHE
            }
        }
        else -> DEFAULT_PREFETCH_CACHE
    }
    

Java

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

    TelephonyManager tm =
      (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

    int PrefetchCacheSize = DEFAULT_PREFETCH_CACHE;

    switch (activeNetwork.getType()) {
      case (ConnectivityManager.TYPE_WIFI):
        PrefetchCacheSize = MAX_PREFETCH_CACHE; break;
      case (ConnectivityManager.TYPE_MOBILE): {
        switch (tm.getNetworkType()) {
          case (TelephonyManager.NETWORK_TYPE_LTE |
                TelephonyManager.NETWORK_TYPE_HSPAP):
            PrefetchCacheSize *= 4;
            break;
          case (TelephonyManager.NETWORK_TYPE_EDGE |
                TelephonyManager.NETWORK_TYPE_GPRS):
            PrefetchCacheSize /= 2;
            break;
          default: break;
        }
        break;
      }
      default: break;
    }