簡介
從Android 6.0(API level 23)開始,Android提出了兩個延長電池使用時間的省電特性給使用者。使用者管理可以在沒有充電的情況下管理app的行為。當使用者一段時間沒有使用手機的時候,Doze模式通過延緩app背景的CPU和網絡活動減少電量的消耗。App Stanbdy延緩使用者最近沒有使用app的背景網絡活動。
Doze和App Stanbdy管理所有在Android6.0+正在運作app的行為。
了解Doze模式
如果一個使用者斷開了充電連接配接,關屏不動手機一段時間之後,裝置進入Doze模式。在Doze模式中,系統嘗試去通過減少應用的網絡通路和CPU敏感的服務來保護電池。它也阻止應用通過通路網絡,并且延緩應用的任務、同步和标準alarms。
系統定期退出Doze模式(maintenance window)去讓app完成他們被延緩的動作。在maintenance window期間,系統運作所有挂起的同步、任務和alarms,同時也能通路網絡。

圖一:Doze模式提供一個複發的maintenance window給app去使用網絡和處理挂起的操作
在每個maintenance window完結時,系統會再次進入Doze模式,暫停網絡接入和延緩操作、同步和alarms。随着時間的過去,當裝置沒有充電且長時間靜止時系統排程maintenance window的次數越來越少,以此幫助減少電池消耗。
隻要使用者通過移動、點亮螢幕或則插上充電器喚醒裝置的時候,系統會退出Doze模式,所有的app退回到正常活動狀态。
Doze模式限制
Doze模式中的限制
l 網絡接入被暫停
l 系統忽略wake locks
l 标準的AlarmManager alarms(包括setExact()和setWindow())被延緩到下一個maintenance window
n 如果你需要在Doze狀态下啟動設定的alarms,使用setAndAllowWhileIdle()或者setExactAndAllowWhileIdle()。
n 當有setAlarmClock()的alarms啟動時,系統會短暫退出Doze模式
l 系統不會掃描Wi-Fi
l 系統不允許sync adapters運作
l 系統不允許JobScheduler運作
Doze模式下的app适配
Doze模式能不同程度的影響app,這個程度取決于app提供的能力和他們使用到的服務。許多app在沒有修改的情況下運作到Doze模式功能正常。在許多情況下,你必須優化app程度管理網絡、alarms、任務和同步。App應該能有效地管理在每個maintenance window時的活動。
Doze模式特别容易影響到AlarmManager alarms和timers管理活動,因為當系統進入Doze模式時,不高于Android 5.1 (API level 22)的alarms不會被啟動。
為了幫助安排alarms,Android 6.0引進了兩個新AlarmManager方法:setAndAllowWhileIdle()和setExactAndAllowWhileIdle()。通過這些方法,你能設定在Doze模式下啟動的alarms。
Tips:不論setAndAllowWhileIdle()還是setExactAndAllowWhileIdle(),每個app都隻能啟動alarms不超過15分鐘一次。
Doze模式限制網絡接入,很可能影響到app,尤其是即時資訊類。如果app需要一個長連接配接去接收網絡消息,你可能應該使用Google Cloud Messaging(GCM)。
你可以使用adb指令強制系統進入/退出Doze模式觀察app在Doze模式下的表現是否符合期望。詳情請看Doze和App Standby模式測試。
了解App Standby模式
App Stanbdy模式允許系統決定一個app在使用者沒有使用的時候變成空閑的。當使用者沒有觸摸app在一段時間内并且沒有下列條件的情況下,系統會做這個決定。
l 使用者沒有明确啟動這個app
l App目前有一個程序在前台(一個activity或者前台服務,又或者被另一個activity或前台服務使用)
l App關聯到一個能夠在鎖屏或者通知欄看見的一個通知
當使用者插上電源時,系統從Stanbdy狀态釋放app,允許他們自由通路網絡,執行挂起的任務和同步。如果這個裝置長時間處在idle狀态,系統允許idle的app每天通路一次網絡。
使用GCM
Google Cloud Messaging (GCM) 是一個cloud-to-device 服務,可以讓你支援背景服務和apps在Android裝置上的實時下行的消息。GCM提供一個單一的、持久的到雲的連接配接,所有的需要實時消息的app可以共享這個連接配接。這種共享連接配接能顯著優化電池消耗。因為許多app沒有必要維護自己獨立持久連接配接,這種連接配接能夠快速的消耗電池。出于這個原因,如果你的應用程式需要與後端服務的消息內建,如果可能的話,我們強烈建議您使用GCM,而不是維護自己的持久的網絡連接配接。
被優化的GCM在Doze和App Standby空閑模式中通過高優先級的GCM消息的方式工作。GCM高優先級的消息讓你可靠地喚醒你的應用程式通路網絡,即使使用者的裝置處于Doze或應用程式是在App Standby模式。在Doze或App Standby模式下,系統傳遞消息,并給出了應用程式的臨時通路網絡服務和部分wakelocks,然後傳回裝置或app到空閑狀态。
高優先級GCM消息不會否則影響Doze模式,并不會影響任何其他app的狀态。這意味着您的應用程式可以使用它們有效率的溝通,同時最大限度地降低整個系統和裝置的電池影響。
作為一般的最佳實踐,如果你的應用程式需要下行的消息,它應該使用GCM。如果您的伺服器和用戶端已經使用GCM,請確定您的服務使用的重要消息的高優先級的消息,因為這将可靠地喚醒app,即使裝置處于Doze模式。
其他項支援
幾乎所有的應用程式應該能夠通過管理網絡連接配接,alarms,工作和同步正常,并使用GCM高優先級的消息,以支援Doze模式。窄範圍的使用場景,這可能是不充足的。對于這種情況,系統提供的部分不進入Doze模式和優化的App Standby模式的可配置的應用白名單。
白名單中的app能夠在Doze和App Standby模式時使用網絡和持有部分wake locks。然而,其他限制任然在白名單應用上生效,和其他應用一樣。例如,白名單應用程式的工作,同步被推遲,并定期的AlarmManager alarms不啟動。一個應用程式可以檢查它是否在目前的白名單中,通過調用isIgnoringBatteryOptimizations()方法。
使用者能夠在設定>電池>電池優化中進行手動配置白名單。另外,系統提供詢問使用者添加到白名單的方式給app
l App能夠啟動帶有ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS的intent,引導使用者到電量優化界面,讓使用者添加app到白名單裡面
l App擁有REQUEST_IGNORE_BATTERY_OPTIMIZATIONS權限,能夠彈出一個系統對話框,讓使用者選擇是否直接添加app到白名單中。這個app啟動帶有ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS的intent去彈出這個對話框。
l 使用者能手動從白名單中移除app
在要求使用者添加app到白名單之前,確定應用符合白名單相比對的可接受的使用情況。
Note:Google應用商店政策禁止app在Android 6.0+(Doze 和 App Standby模式)直接請求電量管理功能,除非應用程式核心功能會有受到不良影響。
Doze和App Standby測試
為了一個良好的使用者體驗,你應該在Doze和App Standby模式下全面測試你的app。
Doze模式下app測試
測試步驟:
1.配置硬體裝置或虛拟機到Android 6.0+
2.連接配接裝置到開發機上,然後安裝app
3.運作app,讓他活動着
4.關掉螢幕(app依然活動着)
5.強制系統進入Doze模式,使用以下指令
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
你應該至少運作兩個指令一次,反複直到裝置進入空閑狀态。
6.重新激活裝置之後觀察app的行為。確定當裝置退出Doze模式之後app恢複正常
App Standby模式下app測試
測試步驟:
1.配置硬體裝置或虛拟機到Android 6.0+
2.連接配接裝置到開發機上,然後安裝app
3.運作app,讓他活動着
4.強制app進入App Standby模式
$ 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.喚醒之後觀察應用表現。確定應用恢複到正常的Standby模式。特别是,應該檢查以下app的通知和背景任務符合預期。
使用白名單例子
下表突出了正在請求或正在對電池優化之外白名單可使用案例。在一般情況下,你的應用程式不應該是在白名單,除非Doze或App Standby模式打破了應用程式的核心功能或者有app存在技術原因不能使用GCM高優先級的消息。
更多資訊,請看其他項支援
類型 | 用例 | 是否能使用GCM | 白名單 | 說明 |
即時通訊,聊天,或電話 | 在Doze或App Standby模式需要實時消息給使用者的app | 使用GCM | 不能添加到白名單 | 應該使用GCM高優先級的消息來喚醒app和網絡通路 |
使用GCM,但是不使用GCM高優先級消息 | ||||
即時通訊,聊天,或電話;企業VoIP apps | 不能使用GCM,因為技術依賴。或者Doze和App Standby模式破壞了程式的核心功能 | 可以添加到白名單 |