Android 6.0的Doze(度枯)新功能對APP開發的影響

作者 | 2016-10-21

自Android 6.0 Marshmallow棉花糖開始,為了節省手機寶貴的電量,推出了Doze這個新技術,可以在手機螢幕關閉一段時間後,讓在運行中的APP進入省電狀態,不再讓它耗用網路、CPU運算等資源。這個功能目的是要提高手機充電後的使用時間,但對Android APP的開發人員有著不小的影響,因為在Android 6.0後,你得要考慮一些其他方案,才能讓手機能夠即時接收訊息或取得網路連線資料。

Android的對手iOS,其實遠在iOS 6時,iPhone就會在APP進入背景後的一段時間後,就殺掉APP的行程,從10分鐘一直進展到目前的3分鐘,看來Apple的作法更殺 …

由目前一些APP上架時被駁回的理由(如下圖)來看,目前Google正開始對上架的APP進行驗證,檢查是否能通過Doze與App Standby(另一個降低耗用的機制),若出現問題,就直接退回你的上架版本了:

a8001

遭拒的應用程式

「您最近提交的應用程式違反裝置與網路濫用行為政策…」訊息大都是因為「應用程式待命進行最佳化」的問題,很有可能是因為對Doze狀態特別處理,而導致APP被拒絕上架。

Doze的運作

如果手機不在充電狀態並關閉螢幕一陣子後,Android會進入「Doze模式」,而正在執行的APP會被系統限制使用網路與CPU運算,如果APP中有設計如定時工作(Schedule Jobs)或鬧鐘等工作,造成不能正常運作。而系統會在Doze模式經過一段時間後,回復一小段時間,讓APP得以進行原本的工作,這段工作時間稱為「維護窗口(maintenance window)」,之後隨即又進入下一個Doze模式,而這一個Doze模式的時間會比上一個久一點,以此類推。以Android開發者網站上的一張圖最能夠說明這個過程:

doze

圖出處: https://developer.android.com/training/monitoring-device-state/doze-standby.html

Doze模式的影響

當手機在Doze模式時,被限制的工作如下:

  • APP的網路存取被限制了。
  • APP中如果有設計讓手機醒過來自動解鎖螢幕(wake locks)將不會運作。
  • 如果呼叫了AlarmManager的setExact或setWindow方法,將在下一次的維修窗口才會執行。
  • 不允許執行WIFI熱點掃描、sync adapter與JobScheduler。

一般來說,APP都能在Doze模式下正常執行,但假如你的APP經常在某個時間需要連回伺服器取得資料、傳送手機資料到後端或是定時需要執行同步或排程等工作,這類的工作就會在Doze模式時失效,而造成APP執行問題。

Google提出幾個解決方法,可以讓上述的需求能夠在Doze模式也能滿足APP的功能需求:

使用GCM

Google Cloud Messaging雲端推播服務可以由自己所建立的伺服器傳送推播訊息至手機中,但一般的推播訊息無法在Doze模式中正常運作,得要送出高優先權的推播訊息(high-priority GCM message)才行。當手機在Doze模式時收到高優先推播訊息時,會暫時允許APP使用網路與半套的螢幕解鎖,並在使用完後再回到Doze模式。

可以使用這個解決方案的應用如即時訊息聊天(chat)、呼叫功能(calling, 例如Walkie-Talkie對講機)。

加入Doze模式的例外名單(white list)

有些應用如VOIP網路電話、SIP或必須要與伺服器建立Socket連線等,那就沒法使用GCM這類的解決方案,Android也提供例外名單,或稱為白名單(white list)的功能。讓使用者在Android手機中將特定APP加入不列入Doze管制的名單中(設定 | 電源 | 電池最佳化),如下圖:

a8002

這需要使用者自行加入該APP,也可以在APP加入程式設計,讓APP在執行時就開啟對話框,請使用者點一下對話框即將APP加入白名單中,如下圖:

a8003

方法可參考 https://developer.android.com/training/monitoring-device-state/doze-standby.html 中的解決方式與介紹。

[版權聲明]

本文章版權為湯秉翰所有,授權範圍僅限綠豆湯網站使用,除Facebook之類社群等未更改本文章出處之分享行為不在此限,其他個人或公司未經作者同意,不得任意將本文章內容轉載至其他網站,或以任何形式重製,為以免觸犯著作權法,請尊重作者之智慧財產權。

相關文章:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *