欢迎参加我们将于 6 月 3 日举行的 #Android11:Beta 版发布会

基于连接类型修改下载模式

在对电池续航时间的影响方面,并非所有连接类型的电池续航时间都均等。不仅 WLAN 无线装置比同类无线装置的耗电量低得多,而且不同的无线装置技术所使用的无线装置对电池的影响也不尽相同。

使用 WLAN

在大多数情况下,WLAN 无线装置能够以低得多的电池成本提供更大的带宽。因此,您应尽可能在使用 WLAN 连接时执行数据传输。

您可以使用广播接收器来监听如下连接更改:指示何时建立了 WLAN 连接来执行重要的下载任务、优先处理排定的更新以及甚至可能暂时增加定期更新的频率,如延长电池续航时间课程的确定和监控连接状态中所述。

使用更高的带宽以更低的频率下载更多数据

通过无线装置连接时,带宽越高,电池成本通常越高。也就是说,LTE 通常比 3G 的耗电量多,而 3G 比 2G 更昂贵。

这意味着,虽然底层无线装置状态机因无线装置技术而异,但一般而言,无线装置的带宽越高,状态更改拖尾时间对电池续航时间造成的相对影响就越大。

同时,带宽越高,则意味着您可以更主动地预先抓取数据,从而在相同的时间下载更多数据。虽然可能不太直观,但因为拖尾时间电池成本相对较高,因此更有效的做法是在每个传输会话过程中,使无线装置长时间保持活动状态以降低更新频率。

例如,如果 LTE 无线装置的带宽和电池成本均是 3G 的两倍,那么在每个会话过程中,您应下载 4 倍的数据量,甚至可能高达 10mb。下载如此大量的数据时,请务必考虑预先抓取对可用本地存储空间的影响,并定期清空预先抓取的缓存。

您可以使用连接管理器来确定处于活动状态的无线装置,并相应地修改预先抓取的日常安排:

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