共計(jì) 2785 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。
本篇內(nèi)容介紹了“Android 的 Doze and App Standby 模式是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓丸趣 TV 小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Optimizing for Doze and App Standby
從 Android6.0 開始,Android 提供了兩種省電延長(zhǎng)電池壽命的功能:Doze 和 App Standby;
表現(xiàn)形式:當(dāng)設(shè)備沒(méi)有連接到電源,設(shè)備進(jìn)入 Doze 模式時(shí),系統(tǒng)將通過(guò)延遲最近用戶沒(méi)有使用的應(yīng)用程序的后臺(tái) CPU 運(yùn)作及網(wǎng)絡(luò)活動(dòng),讓應(yīng)用程序處于 App Standby 狀態(tài),以此來(lái)減少電池消耗。谷歌表示,在 Nexus5 和 Nexus6 上測(cè)試,當(dāng)屏幕處于關(guān)閉狀態(tài),平均續(xù)航時(shí)間提高 30%;
版本要求:Android6.0(API level 23)及其更高版本;
開發(fā)者影響:為了保證用戶的最佳體驗(yàn),開發(fā)者有必要在 Doze 和 App Standby 模式下測(cè)試應(yīng)用程序,及其對(duì)代碼進(jìn)行相應(yīng)的調(diào)整。
Understanding Doze1. 設(shè)備進(jìn)入 Doze 睡眠模式時(shí)機(jī):
用戶不操作設(shè)備一段時(shí)間
屏幕關(guān)閉
設(shè)備未連接電源充電
2.Doze 模式下應(yīng)用程序有什么變化:
系統(tǒng)試圖通過(guò)限制應(yīng)用程序訪問(wèn)網(wǎng)絡(luò)和 CPU 密集型服務(wù)節(jié)省電池;
防止應(yīng)用程序訪問(wèn)網(wǎng)絡(luò),推延應(yīng)用程序的工作,同步,和標(biāo)準(zhǔn)的警報(bào);
系統(tǒng)定期提供一個(gè)短暫的時(shí)間讓應(yīng)用程序完成延遲的工作活動(dòng),在這個(gè)時(shí)間片里,系統(tǒng)將提供維持性窗口應(yīng)用程序訪問(wèn)網(wǎng)絡(luò),運(yùn)行在等待的同步,工作,和報(bào)警等活動(dòng)。
Doze 模式的五種狀態(tài),分別如下:
ACTIVE:手機(jī)設(shè)備處于激活活動(dòng)狀態(tài)
INACTIVE:屏幕關(guān)閉進(jìn)入非活動(dòng)狀態(tài)
IDLE_PENDING:每隔 30 分鐘讓 App 進(jìn)入等待空閑預(yù)備狀態(tài)
IDLE:空閑狀態(tài)
IDLE_MAINTENANCE:處理掛起任務(wù)
如下圖所示,Doze 期間提供間隔一小段時(shí)間(30s)供應(yīng)用程序使用網(wǎng)絡(luò)和處理掛起的活動(dòng)。
從這張圖我們可以看到,系統(tǒng)進(jìn)入 Doze 模式后,系統(tǒng)會(huì)隔一段時(shí)間處理正在掛起的任務(wù),隨著時(shí)間推移,后面間隔的時(shí)間會(huì)越來(lái)越長(zhǎng),以此來(lái)減少電量消耗。
3. 退出 Doze 模式(系統(tǒng)退出休眠,所有的應(yīng)用程序恢復(fù)正常活動(dòng)):
用戶喚醒裝置移動(dòng),打開屏幕
或者設(shè)備連接電源
4.Doze 有哪些限制?
網(wǎng)絡(luò)連接會(huì)被禁止
Wake Lock 會(huì)被屏蔽
AlarmManager 定時(shí)任務(wù)延遲到下一個(gè) maintenance window 進(jìn)行處理,除非使用 AlarmManager 提供的方法:setAndAllowWhileIdle() 或者 setExactAndAllowWhileIdle()
系統(tǒng)將不掃描熱點(diǎn) WIFI
同步工作將被禁止
不允許 JobScheduler 進(jìn)行任務(wù)調(diào)度
5. 適配 Doze 模式有什么方法?
Doze 影響到 AlarmManager 鬧鐘和定時(shí)器管理活動(dòng),在 Android6.0 引入了兩個(gè)新方法:setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle(),調(diào)用兩個(gè)方法可以在 Doze 模式下讓系統(tǒng)響應(yīng)定時(shí)任務(wù)
Doze 模式下限制了網(wǎng)絡(luò)的連接,如果應(yīng)用程序依賴于實(shí)時(shí)信息,那么這個(gè)將影響 App 的體驗(yàn)。那么你需要使用 Google Cloud Messaging (GCM) 谷歌云消息(后面詳細(xì)講解)
6. 測(cè)試 Doze 和 App Standby 模式的方法(Adb 命令)
測(cè)試 Doze 模式
首先確保你的硬件或虛擬設(shè)備是 Android6.0 或更高版本系統(tǒng);
連接設(shè)備到開發(fā)機(jī)上并安裝你的 app;
運(yùn)行 app 并讓其運(yùn)行活動(dòng);
關(guān)閉設(shè)備的屏幕;
運(yùn)行以下 adb 命令使系統(tǒng)進(jìn)入 Doze 模式:
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
觀察你的 app 表現(xiàn)行為是否有需優(yōu)化改進(jìn)的地方。
測(cè)試 App Standby 模式
步驟 1 - 3 同測(cè)試 Doze 模式
運(yùn)行以下 adb 命令迫使系統(tǒng)進(jìn)入 App Standby 模式:
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive true
模擬喚醒你的應(yīng)用程序使用以下命令:
$ adb shell am set-inactive false
$ adb shell am get-inactive
觀察你的 App,確保應(yīng)用程序恢復(fù)正常從待機(jī)模式過(guò)程中,App 的通知及其背部活動(dòng)能達(dá)到預(yù)期結(jié)果。
Understanding App Standby
當(dāng)用戶不觸摸使用應(yīng)用程序一段時(shí)間時(shí),該應(yīng)用程序處于 App Standby 狀態(tài),系統(tǒng)將把該 App 標(biāo)志為空閑狀態(tài)。除非觸發(fā)以下任意條件,應(yīng)用程序?qū)⑼顺?App Standby 狀態(tài):
用戶主動(dòng)啟動(dòng)該 App;
該 App 當(dāng)前有一個(gè)前臺(tái)進(jìn)程(或包含一個(gè)活動(dòng)的前臺(tái)服務(wù),或被另一個(gè) activity 或前臺(tái) service 使用);
App 生成一個(gè)用戶所能在鎖屏或通知托盤看到的 Notification, 而當(dāng)用戶設(shè)備插入電源時(shí),系統(tǒng)將會(huì)釋放 App 的待機(jī)狀態(tài),允許他們自由的連接網(wǎng)絡(luò)及其執(zhí)行未完成的工作和同步。如果設(shè)備空閑很長(zhǎng)一段時(shí)間,系統(tǒng)將允許空閑 App 一天一次訪問(wèn)網(wǎng)絡(luò)。
Doze 和 App Standby 的區(qū)別:
Doze 模式需要屏幕關(guān)閉(通常晚上睡覺(jué)或長(zhǎng)時(shí)間屏幕關(guān)閉才會(huì)進(jìn)入),而 App Standby 不需要屏幕關(guān)閉,App 進(jìn)入后臺(tái)一段時(shí)間也會(huì)受到連接網(wǎng)絡(luò)等限制。
Using GCM to Interact with Your App While the Device is Idle1. 什么是 GCM?
Google Cloud Messaging(GCM) 是一個(gè)云到設(shè)備的服務(wù),可以讓你支持實(shí)時(shí)在云端服務(wù)和 Android 設(shè)備上應(yīng)用程序之間的消息傳遞。
GCM 提供了一個(gè)持久連接到云端的鏈接,讓所有需要實(shí)時(shí)消息傳遞應(yīng)用程序可以共享此鏈接。這個(gè)共享鏈接顯著優(yōu)化電池消耗,使其不必讓多個(gè)應(yīng)用程序各位維護(hù)自己?jiǎn)为?dú)的持久鏈接而使電池迅速耗盡。
由于這個(gè)原因,官方建議:如果你的應(yīng)用需要消息傳遞與后端服務(wù)集成,我們強(qiáng)烈建議盡可能的使用 GCM,而不是單獨(dú)維護(hù)自己的網(wǎng)絡(luò)鏈接。
GCM 消息擁有高優(yōu)先級(jí),不影響 Doze 模式,且不會(huì)不影響其他應(yīng)用程序的狀態(tài)。這意味著你的應(yīng)用程序可以使用它們進(jìn)行通信,同時(shí)最大限度地減少電池在整個(gè)系統(tǒng)和設(shè)備的影響。
以下來(lái) GCM 自官方解釋:
一個(gè) GCM 實(shí)現(xiàn)包括谷歌連接服務(wù)器,在你的環(huán)境中通過(guò) HTTP 或 XMPP 協(xié)議的連接服務(wù)器進(jìn)行交互的應(yīng)用程序服務(wù)器和客戶端應(yīng)用程序。
$ adb shell dumpsys deviceidle whitelist +
$ adb shell dumpsys deviceidle
“Android 的 Doze and App Standby 模式是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實(shí)用文章!