1. 程式人生 > >不耗電傳輸資料(四):基於連線型別改變下載模式

不耗電傳輸資料(四):基於連線型別改變下載模式

基於連線型別改變下載模式

不同連結型別對電量的消耗並不相同。不單WiFi比無線網路耗電量小的多,不同技術下的無線網路耗電量也不同。

用WiFi

多數情況下,WiFi網路能夠提供更大頻寬並大量減少耗電。所以如果WiFi可用,儘量使用WiFi傳輸資料。

你可以用BroadcastReceiver監聽連線的改變,當WiFi連線可用的時候,執行大量資料下載,排程更新,甚至臨時增加更新頻率。

頻寬和資料量更大時降低聯網頻率

當連線到無線網路是,更大的頻寬往往意味著更高的耗電量。也就是說典型的LTE要比3G網更耗電,也更貴。

儘管不同的網路有不同的狀態機,總體來說,更寬的頻寬意味著狀態機超時時間更長。

同時,更高的頻寬意味著同樣時間內,能預取和下載更多資料。因為超時時間相對更長,所以降低更新頻率而更長時間的保持一個連線更高效些。

例如,如果LTE頻寬和能耗都是3G網的兩倍,那麼你應該在一個會話中下載四倍於3G網的資料,也就是大約10兆位元組。下載這麼大的資料量,考慮本地緩衝預取的效率和定期重新整理緩衝區就變得很重要。

你可以用ConnectivityManager確定連線型別,並相應調整預取程式:

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