Modificar padrões de download com base no tipo de conexão

Quando se trata de afetar a duração da bateria, nem todos os tipos de conexão são criados da mesma forma. Além de o rádio Wi-Fi consumir significativamente menos bateria do que os rádios sem fio equivalentes, os rádios usados em diferentes tecnologias sem fio têm implicações diferentes na bateria.

Usar Wi-Fi

Na maioria dos casos, um rádio Wi-Fi oferece maior largura de banda com um custo de bateria significativamente menor. Como resultado, você precisa se esforçar, sempre que possível, para realizar transferências de dados quando o dispositivo estiver conectado por Wi-Fi.

Você pode usar um broadcast receiver para ouvir as mudanças de conectividade que indicam quando uma conexão Wi-Fi foi estabelecida para executar downloads significativos, forçar atualizações programadas e, possivelmente, aumentar mesmo que temporariamente a frequência de atualizações regulares, como descrito na lição Como otimizar a duração da bateria e em Determinar e monitorar o status da conectividade.

Usar uma maior largura de banda para fazer o download de mais dados com menos frequência

Quando o dispositivo está conectado por um rádio sem fio, uma largura de banda maior geralmente tem um maior custo de bateria. Isso significa que o LTE normalmente consome mais energia que o 3G, que tem um custo maior que o 2G.

Assim, embora a máquina de estado de rádio subjacente varie de acordo com a tecnologia de rádio, de maneira geral, o impacto relativo na bateria causado pelo tempo de cauda da mudança de estado é maior para rádios com largura de banda mais alta.

Ao mesmo tempo, a maior largura de banda permite uma pré-busca mais agressiva, fazendo o download de mais dados de uma só vez. Talvez menos intuitivamente, porque o custo da bateria no tempo de cauda é relativamente maior, e também é mais eficiente manter o rádio ativo por períodos mais longos durante cada sessão de transferência para reduzir a frequência das atualizações.

Por exemplo, se um rádio LTE tiver o dobro da largura de banda e o dobro do custo de energia do 3G, você precisará fazer o download de quatro vezes mais dados durante cada sessão, ou até 10 MB. Ao fazer o download de tantos dados, é importante considerar o efeito da pré-busca no armazenamento local disponível e limpar o cache de pré-busca regularmente.

Você pode usar o gerenciador de conectividade para determinar o rádio sem fio ativo e modificar suas rotinas de pré-busca conforme necessário:

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