Android 6.0新特性之Doze模式

簡介

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 windowapp去使用網絡和處理掛起的操作

在每個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 alarmstimers管理活動,因爲當系統進入Doze模式時,不高於Android 5.1 API level 22)的alarms不會被啓動。

爲了幫助安排alarmsAndroid 6.0引進了兩個新AlarmManager方法:setAndAllowWhileIdle()setExactAndAllowWhileIdle()。通過這些方法,你能設置在Doze模式下啓動的alarms

Tips:不論setAndAllowWhileIdle()還是setExactAndAllowWhileIdle(),每個app都只能啓動alarms不超過15分鐘一次。

Doze模式限制網絡接入,很可能影響到app,尤其是即時信息類。如果app需要一個長連接去接收網絡消息,你可能應該使用Google Cloud MessagingGCM)。

你可以使用adb命令強制系統進入/退出Doze模式觀察appDoze模式下的表現是否符合期望。詳情請看DozeApp Standby模式測試

理解App Standby模式

App Stanbdy模式允許系統決定一個app在用戶沒有使用的時候變成空閒的。當用戶沒有觸摸app在一段時間內並且沒有下列條件的情況下,系統會做這個決定。

l 用戶沒有明確啓動這個app

l App當前有一個進程在前臺(一個activity或者前臺服務,又或者被另一個activity或前臺服務使用)

l App關聯到一個能夠在鎖屏或者通知欄看見的一個通知

當用戶插上電源時,系統從Stanbdy狀態釋放app,允許他們自由訪問網絡,執行掛起的任務和同步。如果這個設備長時間處在idle狀態,系統允許idleapp每天訪問一次網絡。

使用GCM

Google Cloud Messaging (GCM) 是一個cloud-to-device 服務,可以讓你支持後臺服務和appsAndroid設備上的實時下行的消息。GCM提供一個單一的、持久的到雲的連接,所有的需要實時消息的app可以共享這個連接。這種共享連接能顯著優化電池消耗。因爲許多app沒有必要維護自己獨立持久連接,這種連接能夠快速的消耗電池。出於這個原因,如果你的應用程序需要與後端服務的消息集成,如果可能的話,我們強烈建議您使用GCM,而不是維護自己的持久的網絡連接。

被優化的GCMDozeApp Standby空閒模式中通過高優先級的GCM消息的方式工作。GCM高優先級的消息讓你可靠地喚醒你的應用程序訪問網絡,即使用戶的設備處於Doze或應用程序是在App Standby模式。在DozeApp Standby模式下,系統傳遞消息,並給出了應用程序的臨時訪問網絡服務和部分wakelocks,然後返回設備或app到空閒狀態。

高優先級GCM消息不會否則影響Doze模式,並不會影響任何其他app的狀態。這意味着您的應用程序可以使用它們有效率的溝通,同時最大限度地降低整個系統和設備的電池影響。

作爲一般的最佳實踐,如果你的應用程序需要下行的消息,它應該使用GCM。如果您的服務器和客戶端已經使用GCM,請確保您的服務使用的重要消息的高優先級的消息,因爲這將可靠地喚醒app,即使設備處於Doze模式。

其他項支持

幾乎所有的應用程序應該能夠通過管理網絡連接,alarms,工作和同步正常,並使用GCM高優先級的消息,以支持Doze模式。窄範圍的使用場景,這可能是不充足的。對於這種情況,系統提供的部分不進入Doze模式和優化的App Standby模式的可配置的應用白名單。

白名單中的app能夠在DozeApp Standby模式時使用網絡和持有部分wake locks。然而,其他限制任然在白名單應用上生效,和其他應用一樣。例如,白名單應用程序的工作,同步被推遲,並定期的AlarmManager alarms不啓動。一個應用程序可以檢查它是否在當前的白名單中,通過調用isIgnoringBatteryOptimizations()方法。

用戶能夠在設置>電池>電池優化中進行手動配置白名單。另外,系統提供詢問用戶添加到白名單的方式給app

l App能夠啓動帶有ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGSintent,引導用戶到電量優化界面,讓用戶添加app到白名單裏面

l App擁有REQUEST_IGNORE_BATTERY_OPTIMIZATIONS權限,能夠彈出一個系統對話框,讓用戶選擇是否直接添加app到白名單中。這個app啓動帶有ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSintent去彈出這個對話框。

l 用戶能手動從白名單中移除app

在要求用戶添加app到白名單之前,確保應用符合白名單相匹配的可接受的使用情況

NoteGoogle應用商店政策禁止appAndroid 6.0+(Doze 和 App Standby模式)直接請求電量管理功能,除非應用程序核心功能會有受到不良影響。

DozeApp Standby測試

爲了一個良好的用戶體驗,你應該在DozeApp 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的通知和後臺任務符合預期。

使用白名單例子

下表突出了正在請求或正在對電池優化之外白名單可使用案例。在一般情況下,你的應用程序不應該是在白名單,除非DozeApp Standby模式打破了應用程序的核心功能或者有app存在技術原因不能使用GCM高優先級的消息。

更多信息,請看其他項支持

類型

用例

是否能使用GCM

白名單

說明

即時通訊,聊天,或電話

DozeApp Standby模式需要實時消息給用戶的app

使用GCM

不能添加到白名單

應該使用GCM高優先級的消息來喚醒app和網絡訪問

使用GCM,但是不使用GCM高優先級消息

即時通訊,聊天,或電話;企業VoIP apps

不能使用GCM,因爲技術依賴。或者DozeApp Standby模式破壞了程序的核心功能

可以添加到白名單

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章