天天看點

Android電量優化(1)——了解低電耗模式

文章目錄

    • 了解低電耗模式
    • 将應用調整到低電耗模式
    • 了解應用待機模式
    • 對其他用例的支援
    • 在低電耗模式和應用待機模式下進行測試

了解低電耗模式

如果使用者裝置未插接電源、處于靜止狀态一段時間且螢幕關閉,裝置會進入低電耗模式。 在低電耗模式下,系統會嘗試通過限制應用對網絡和 CPU 密集型服務的通路來節省電量。 這還可以阻止應用通路網絡并推遲其作業、同步和标準鬧鈴。

系統會定期退出低電耗模式一會兒,好讓應用完成其已推遲的 Activity。在此維護時段内,系統會運作所有待定同步、作業和鬧鈴并允許應用通路網絡。

Android電量優化(1)——了解低電耗模式

圖 1. 低電耗模式提供了定期維護時段,可供應用使用網絡并處理待定 Activity

在每個維護時段結束後,系統會再次進入低電耗模式,暫停網絡通路并推遲作業、同步和鬧鈴。 随着時間的推移,系統安排維護時段的次數越來越少,這有助于在裝置未連接配接至充電器的情況下長期處于不活動狀态時降低電池消耗。

一旦使用者通過移動裝置、打開螢幕或連接配接到充電器喚醒裝置,系統就會立即退出低電耗模式,并且所有應用都将傳回到正常 Activity。

低電耗模式限制

在低電耗模式下,您的應用會受到以下限制:

  • 暫停通路網絡。
  • 系統将忽略 wake locks。
  • 标準

    AlarmManager

    鬧鈴(包括

    setExact()

    setWindow()

    )推遲到下一維護時段。
    • 如果您需要設定在低電耗模式下觸發的鬧鈴,請使用

      setAndAllowWhileIdle()

      setExactAndAllowWhileIdle()

    • 一般情況下,使用

      setAlarmClock()

      設定的鬧鈴将繼續觸發 — 但系統會在這些鬧鈴觸發之前不久退出低電耗模式。
  • 系統不執行 Wi-Fi 掃描。
  • 系統不允許運作同步擴充卡。
  • 系統不允許運作

    JobScheduler

将應用調整到低電耗模式

低電耗模式可能會對應用産生不同程度的影響,具體取決于應用提供的功能和使用的服務。 許多應用無需修改即可在低電耗模式周期中正常運作。 在某些情況下,您必須優化應用管理網絡、鬧鈴、作業和同步的方式。 應用應該能夠在每個維護時段内高效管理 Activity。

低電耗模式很容易影響

AlarmManager

鬧鈴和定時器管理的 Activity,因為當系統處于低電耗模式時,不會觸發 Android 5.1(API 級别 22)或更低版本中的鬧鈴。

為了幫助您安排鬧鈴,Android 6.0(API 級别 23)引入了兩種新的

AlarmManager

方法:

setAndAllowWhileIdle()

setExactAndAllowWhileIdle()

。通過這些方法,您可以設定即使裝置處于低電耗模式也會觸發的鬧鈴。

注:對于每個應用,

setAndAllowWhileIdle()

setExactAndAllowWhileIdle()

觸發鬧鈴的時間間隔都不能低于 9 分鐘。

低電耗模式對網絡通路的限制也有可能影響您的應用,特别是當應用依賴于操作消息 (tickle) 或通知等實時消息時更是如此。 如果應用需要持久連接配接到網絡來接收消息,您應盡量使用 Google Cloud Messaging (GCM)。

要确認應用在低電耗模式下按照預期運作,您可以使用 adb 指令強制系統進入和退出低電耗模式并觀察應用的行為。如需了解詳細資訊,請參閱在低電耗模式和應用待機模式下進行測試。

了解應用待機模式

應用待機模式允許系統判定應用在使用者未主動使用它時處于空閑狀态。 當使用者有一段時間未觸摸應用時,系統便會作出此判定,以下條件均不适用:

  • 使用者顯式啟動應用。
  • 應用目前有一個程序位于前台(表現為 Activity 或前台服務形式,或被另一 Activity 或前台服務占用)。
  • 應用生成使用者可在鎖屏或通知托盤中看到的通知。

當使用者将裝置插入電源時,系統将從待機狀态釋放應用,進而讓它們可以自由通路網絡并執行任何待定作業和同步。 如果裝置長時間處于空閑狀态,系統将按每天大約一次的頻率允許空閑應用通路網絡。

對其他用例的支援

通過妥善管理網絡連接配接、鬧鈴、作業和同步并使用 GCM 高優先級消息,幾乎所有應用都應該能夠支援低電耗模式。對于一小部分用例,這可能還不夠。 對于此類用例,系統為部分免除低電耗模式和應用待機模式優化的應用提供了一份可配置的白名單。

在低電耗模式和應用待機模式期間,加入白名單的應用可以使用網絡并保留部分 wake locks。 不過,正如其他應用一樣,其他限制仍然适用于加入白名單的應用。 例如,加入白名單的應用的作業和同步将推遲(在 API 級别 23 及更低級别中),并且其正常

AlarmManager

鬧鈴不會觸發。通過調用

isIgnoringBatteryOptimizations()

,應用可以檢查自身目前是否位于豁免白名單中。

使用者可以在 Settings > Battery > Battery Optimization 中手動配置該白名單。或者,系統會為應用提供請求使用者将應用加入白名單的方式。

  • 應用可以觸發

    ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS

    Intent,讓使用者直接進入 Battery Optimization,他們可以在其中添加應用。
  • 具有

    REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

    權限的應用可以觸發系統對話框,讓使用者無需轉到“設定”即可直接将應用添加到白名單。應用将通過觸發

    ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

    Intent 來觸發該對話框。
  • 使用者可以根據需要手動從白名單中移除應用。

在請求使用者将應用添加到白名單之前,請確定應用符合加入白名單的可接受用例。

Android電量優化(1)——了解低電耗模式

在低電耗模式和應用待機模式下進行測試

為了確定使用者獲得極佳體驗,您應在低電耗模式和應用待機模式下全面測試您的應用。

在低電耗模式下測試您的應用

您可按以下步驟測試低電耗模式:

  1. 使用 Android 6.0(API 級别 23)或更高版本的系統映像配置硬體裝置或虛拟裝置。
  2. 将裝置連接配接到開發計算機并安裝應用
  3. 運作應用并使其保持活動狀态
  4. 關閉裝置螢幕。(應用保持活動狀态。)
  5. 通過運作以下指令強制系統在低電耗模式之間循環切換:
    $ adb shell dumpsys battery unplug
    $ adb shell dumpsys deviceidle step
               
    您可能需要多次運作第二個指令。不斷地重複,直到裝置變為空閑狀态。
  6. 在重新激活裝置後觀察應用的行為。確定應用在裝置退出低電耗模式時正常恢複。

在應用待機模式下測試您的應用

要在應用待機模式下測試您的應用,請執行以下操作:

  1. 使用 Android 6.0(API 級别 23)或更高版本的系統映像配置硬體裝置或虛拟裝置。
  2. 将裝置連接配接到開發計算機并安裝應用
  3. 運作應用并使其保持活動狀态
  4. 通過運作以下指令強制應用進入應用待機模式:
    $ adb shell dumpsys battery unplug
    $ adb shell am set-inactive <packageName> true
               
  5. 使用以下指令模拟喚醒應用:
    $ adb shell am set-inactive <packageName> false
    $ adb shell am get-inactive <packageName>
               
  6. 觀察喚醒後的應用行為。確定應用從待機模式中正常恢複。 特别地,您應檢查應用的通知和背景作業是否按預期繼續運作

繼續閱讀