針對網路存取權進行最佳化

使用無線電傳輸資料可能是應用程式耗電量最大的來源之一。如要盡量減少與網路活動相關的耗電量,請務必瞭解連線模型如何影響底層無線電硬體。

本節將介紹無線電狀態機制,並說明應用程式的連線模式如何與之互動。接著提供幾種技巧,只要遵循這些技巧,就能盡可能減少應用程式對電池的資料消耗量。

無線電狀態機器

使用者裝置上的無線電台內建省電功能,可盡量減少電池耗電量。在完全運作時,無線電會耗用大量電力,但在閒置或待機時,電力消耗量就會降到最低。

請注意,無線電無法從待機狀態立即轉為完全運作狀態。與「開啟」無線電相關的延遲時間。因此,電池會從較高能量狀態緩慢轉換至較低能量狀態,以便在未使用時節省電力,同時盡量減少與「開啟」無線電相關的延遲時間。

一般 3G 網路無線電的狀態機包含三種能量狀態:

  • 全速:在連線處於活動狀態時使用,可讓裝置以最高傳輸速率傳輸資料。
  • 低耗電:這是一種中間狀態,可將電池耗電量降低約 50%。
  • 待機:無網路連線時的最低耗電狀態。

雖然低電量和待機狀態會耗用較少電量,但也會導致網路要求出現明顯的延遲。從低電量狀態恢復到全電量狀態大約需要 1.5 秒,從待機狀態恢復到全電量狀態則可能需要超過 2 秒。

為盡量減少延遲時間,狀態機制會使用延遲時間,將轉換延後至較低的省電狀態。圖 1 使用 AT&T 的 3G 無線電典型時間。


圖1. 典型的 3G 無線電狀態機制。

每部裝置的無線電狀態機器,特別是相關聯的轉換延遲時間 (稱為「尾端時間」) 和啟動延遲時間,會因所採用的無線電技術 (3G、LTE、5G 等) 而異,並由裝置運作的電信業者網路定義及設定。

本頁面根據 AT&T 提供的資料,說明典型 3G 無線電的代表性狀態機器。不過,一般原則和相關最佳做法適用於所有無線電實作。

這種做法特別適用於一般行動版網頁瀏覽,因為這可避免使用者在瀏覽網頁時發生不必要的延遲。相對較短的尾端時間也能確保瀏覽工作階段結束後,無線電可以轉移至較低的耗電狀態。

不過,在 Android 等現代智慧型手機作業系統上,這種做法可能會導致應用程式效率不彰,因為應用程式會同時在前景 (延遲時間很重要) 和背景 (應優先考量電池續航力) 執行。

應用程式對無線電狀態機制的影響

每次建立新的網路連線時,無線電會轉換為全功率狀態。以先前所述的典型 3G 無線電狀態機器為例,在傳輸期間,無線電會維持全功率,再加上額外的 5 秒尾端時間,然後進入 12 秒的低耗電狀態。因此,對於一般 3G 裝置而言,每個資料傳輸工作階段都會導致無線電耗電至少 18 秒。

實際上,這表示每分鐘進行三次一秒資料傳輸的應用程式會讓無線電持續處於啟用狀態,並在進入待機模式時將其移回高功率。


圖2. 每分鐘執行三次一秒鐘傳輸作業的相對無線電功率使用量。這張圖表不包含執行間的「啟動」延遲時間。

相比之下,如果同一個應用程式將資料傳輸作業綁定在一起,每分鐘執行一次三秒的傳輸作業,則無線電會維持在高耗電狀態,總共只會維持 20 秒。這樣一來,無線電就能每分鐘待命 40 秒,大幅降低電池消耗量。


圖3.每分鐘執行一次的三秒傳輸作業,相對無線電功率使用量。

最佳化技巧

瞭解網路存取對電池續航力的影響後,接下來我們將說明幾個可減少電池耗電量,同時提供快速流暢使用者體驗的做法。

資料移轉組合

如前文所述,將資料傳輸作業合併,以便減少傳輸資料次數,是提升電池效率的最佳方式之一。

當然,如果應用程式需要立即接收或傳送資料,以回應使用者操作,就無法執行這項操作。您可以透過預測和預先載入資料來緩解這種情況。其他情境 (例如將記錄或分析資料傳送至伺服器,以及其他非緊急的應用程式啟動資料移轉作業) 非常適合進行批次處理和捆綁。如要瞭解排定背景網路傳輸的訣竅,請參閱「最佳化應用程式啟動的任務」。

預先擷取資料

預先擷取資料是另一種有效的方式,可減少應用程式執行的獨立資料移轉工作階段數量。透過預先擷取功能,當使用者在應用程式中執行某個動作時,應用程式會預測下一個系列使用者動作最有可能需要哪些資料,然後以全速在單一連線中擷取該資料。

透過預先載入轉移作業,您可以減少下載資料所需的無線電啟動次數。如此一來,您不僅能延長電池續航力,還能縮短延遲時間、降低所需頻寬,並縮短下載時間。

預先擷取功能還可縮短應用程式內的延遲時間,因為在執行動作或查看資料前,系統必須等待下載作業完成,而預先擷取功能可避免這類延遲。

以下提供實務範例。

新聞讀者

許多新聞應用程式會嘗試減少頻寬,方法是只在使用者選取類別、想閱讀完整文章,以及捲動至縮圖時,才下載標題、完整文章和縮圖。

使用這種方法後,大多數使用者在閱讀新聞時,無論是捲動標題、變更類別或閱讀文章,都會強制啟用廣播功能。不僅如此,在能量狀態之間不斷切換,也會導致切換類別或閱讀文章時出現明顯的延遲。

更好的方法是在啟動時預先擷取適當數量的資料,從第一組新聞標題和縮圖開始,確保啟動時間的延遲時間較短,並繼續擷取其他標題和縮圖,以及至少從主要標題清單擷取每篇文章的文章文字。

另一種做法是預先擷取每個標題、縮圖、文章文字,甚至是整篇文章的圖片,通常會在背景中依照預先設定的時間表執行。這種做法可能會耗費大量頻寬和電池續航力,用於下載從未使用的內容,因此應謹慎實施。

其他注意事項

雖然預先載入資料有許多優點,但如果過度使用預先載入功能,也會帶來風險,因為系統會下載未使用的資料,導致電池耗電量和頻寬用量增加,以及下載配額增加。另外,請務必確保預先載入不會在應用程式等待預先載入完成時延遲應用程式啟動。在實際情況中,這可能表示要逐步處理資料,或啟動依優先順序進行的連續傳輸,以便先下載及處理應用程式啟動所需的資料。

預先擷取資料的積極程度取決於要下載的資料大小,以及資料被使用的可能性。根據前述狀態機器的粗略指南,如果資料在目前使用者工作階段內的使用機率為 50%,您通常可以先預先載入約 6 秒 (約 1-2 MB) 的資料,然後再下載未使用的資料,這樣一來,您就能在開始下載資料前,先省下不下載資料的潛在成本。

一般來說,預先擷取資料是理想做法,這樣您只需每 2 到 5 分鐘就啟動一次下載作業,且下載量約為 1 到 5 MB。

依據這項原則,下載大型檔案 (例如影片檔案) 時,應以規律的間隔 (每 2 到 5 分鐘) 分段下載,有效地預先載入可能在接下來幾分鐘內觀看的影片資料。

解決方法之一是,只在連上 Wi-Fi 時 (或許還要加上裝置充電時) 安排完整下載作業。WorkManager API 正是支援這種用途,可讓您限制背景工作,直到裝置符合開發人員指定的條件為止,例如充電和連上 Wi-Fi。

請先檢查連線狀態,再提出要求

搜尋行動訊號是行動裝置上耗電量最高的作業之一。針對使用者發起的要求,最佳做法是先使用 ConnectivityManager 檢查連線狀態,如監控連線狀態和連線計量功能所示。如果沒有網路,應用程式可以不強制手機無線電搜尋,藉此節省電力。建立連線後,系統就能排定並執行這項要求,並與其他要求一起批次執行。

連線集區

除了批次處理和預先擷取之外,另一個有助於改善網路效能的策略,就是將應用程式的網路連線集中起來。

一般來說,重複使用現有網路連線比建立新連線更有效率。重複使用連線還可讓網路更聰明地回應壅塞和相關網路資料問題。

HttpURLConnection 和大多數 HTTP 用戶端 (例如 OkHttp) 預設會啟用連線集區,並重複使用相同連線來處理多個要求。

回顧與展望

在本節中,您已瞭解無線電台的相關資訊,並學到一些可廣泛套用的策略,藉此提供快速、即時的使用者體驗,同時減少電池耗電量。

在下一節中,我們將詳細探討大多數應用程式常見的三種不同類型的網路互動。您將瞭解每種類型的驅動程式,以及用於有效管理這些互動的最新技術和 API。