如何高效優化Android網絡連接以降低電耗

在開發android應用時應最大限度地減少下載和網絡連接的電池壽命影響。

一、高效的連接優化下載
應用的影響:
無線電的狀態機由三種能量狀態組成:
1、全功率:當連接激活時使用,允許設備以最高的速率傳輸數據。
2、低功耗:在完全狀態下使用大約50%的電池電量的中間狀態。
3、待機:沒有網絡連接活動或需要的最小能量狀態

雖然低電平和空閒狀態會大大減少電池電量,但它們也會對網絡請求造成很大的延遲。從低狀態恢復到全功率需要大約1.5秒,而從空閒狀態轉爲滿狀態可能需要2秒鐘以上。

在應用中每次創建新的網絡連接時,無線電轉換到全功率狀態。每18秒傳輸1分鐘的無捆綁數據,將使無線電無線電永久活躍,使其恢復到高功率,就像它即將閒置一樣。結果,每分鐘,它將在高功率狀態下消耗電池18秒,在低功率狀態下消耗剩餘的42秒。
相比之下,捆綁每分鐘3秒傳輸的相同應用程序將使收音機處於高功率狀態只有8秒鐘,並將其僅保持在低功率狀態僅需12秒。

預取數據

預取數據是減少獨立數據傳輸會話數量的有效方式。通過預取功能,您可以通過單個連接以滿容量在單個突發中下載您可能需要的給定時間段內的所有數據。
一般來說,預取數據是一個很好的做法,因此您只需要每2到5分鐘啓動另一次下載,即1到5兆的順序。
按照這個原則,大量的下載(例如視頻文件)應該以固定的時間間隔(每2到5分鐘)以大塊的形式下載,只需要在幾分鐘之內只獲取可能被瀏覽的視頻數據。

音樂播放器除了正在播放的歌曲之外,更好的方法是保持一首歌曲的緩衝區。對於流式音樂而言,不是始終保持使無線電處於活動狀態的連續流,而是考慮使用HTTP直播流以突發方式傳輸音頻流

許多新聞應用程序只有在選擇了類別後才能嘗試降低帶寬,只有當用戶想要閱讀這些新聞時,才能閱讀完整的文章,以及在滾動瀏覽時縮略圖。用這種方法,無線電將被迫保持活躍
更好的方法是在啓動時預先獲取合理數量的數據,從第一組新聞頭條和縮略圖開始 - 確保低延遲啓動時間,並繼續其餘的標題和縮略圖,以及每個文章的文章至少可以從主標題列表中獲得文章。

減少連接
重用現有網絡連接通常比啓動新網絡連接更有效。重用連接還允許網絡更智能地對擁塞和相關網絡數據問題做出反應。不要同時創建多個連接下載數據,或連接多個連續的get請求,最好綁定在一個get中。
過早關閉連接可能會阻止它重新使用,這需要額外的開銷來建立新的連接。一個有用的妥協不是立即關閉連接,而是在固有超時到期之前仍然關閉連接。

使用DDMS之類網絡流量工具
Android DDMS(Dalvik Debug Monitor Server)包含一個“詳細網絡使用情況”選項卡,可以跟蹤您的應用程序何時進行網絡請求。使用此工具,您可以監控應用程序如何以及何時轉移數據並適當地優化底層代碼。
通過監控數據傳輸的頻率以及每個連接期間傳輸的數據量,您可以確定應用程序可以使電池更有效率的區域。一般來說,您將會尋找可能被推遲的短尖峯,或者導致稍後的轉移被搶佔。

二、最小化定時更新帶來的影響
定期更新的最佳頻率將根據設備狀態,網絡連接性,用戶行爲和顯式用戶偏好而有所不同。

使用雲設備消息傳遞替代輪詢

每次您的應用程序輪詢您的服務器以檢查是否需要更新時,您可以在典型的3G連接上激活無線電,不必要地抽取電源長達20秒。
Android Cloud to Device Messaging(C2DM)是一種用於將數據從服務器傳輸到特定應用程序實例的輕量級機制。使用C2DM,您的服務器可以通知在特定設備上運行的應用程序有新的數據可用。
與輪詢相比,您的應用程序必須定期ping服務器以查詢新數據,這種事件驅動模式允許您的應用程序僅在知道有數據下載時創建新連接。

三、減少多餘數據下載

本地緩存
避免下載重複的數據。您可以通過積極的緩存來執行此操作。始終緩存靜態資源,包括按需下載,如全尺寸圖像,只要合理可能。應該單獨存儲按需資源,以便您定期刷新按需緩存以管理其大小。
爲確保您的緩存不會導致您的應用程序顯示陳舊的數據,請務必從HTTP響應標頭中提取所請求內容上次更新的時間,以及何時到期。這將允許您確定何時刷新相關內容。
卸載程序時應及時清除緩存文件。

HttpURLConnection Response緩存
Android 中有一個響應緩存HttpURLConnection。您可以使用反射在支持的設備上啓用HTTP響應緩存。

private void enableHttpResponseCache() {
  try {
    long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
    File httpCacheDir = new File(getCacheDir(), "http");
    Class.forName("android.net.http.HttpResponseCache")
         .getMethod("install", File.class, long.class)
         .invoke(null, httpCacheDir, httpCacheSize);
  } catch (Exception httpResponseCacheNotAvailable) {
    Log.d(TAG, "HTTP response cache is unavailable.");
  }
}

安裝緩存後,可以直接從本地存儲提供完全緩存的HTTP請求,從而無需打開網絡連接。有條件緩存的響應可以從服務器驗證其新鮮度,從而消除與下載相關的帶寬成本。

四、根據連接類型修改下載模式

當涉及到電池壽命的影響時,並不是所有的連接類型都是相等的。Wi-Fi無線電使用的電池比無線電無線電相當少。

Wi-Fi
Wi-Fi無線電將以顯着降低的電池成本提供更大的帶寬。因此,在wifi連接時儘量做數據傳輸操作。

更大的帶寬可以更少的下載更多的數據
通過無線電連接時,較高的帶寬通常以較高的電池成本爲代價。也會導致會話期間下載更大的數據量。
您可以使用連接管理器確定活動的無線電廣播,並相應地修改您的預取例程:

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章