高效的保留更多的電量與不斷促使用戶使用你的App來消耗電量,這是矛盾的選擇題。不過我們可以使用一些更好的辦法來平衡兩者。
假設(shè)你的手機里面裝了大量的社交類應(yīng)用,即使手機處于待機狀態(tài),也會經(jīng)常被這些應(yīng)用喚醒用來檢查同步新的數(shù)據(jù)信息。Android會不斷關(guān)閉各種硬件來延長手機的待機時間,首先屏幕會逐漸變暗直至關(guān)閉,然后CPU進入睡眠,這一切操作都是為了節(jié)約寶貴的電量資源。但是即使在這種睡眠狀態(tài)下,大多數(shù)應(yīng)用還是會嘗試進行工作,他們將不斷的喚醒手機。一個最簡單的喚醒手機的方法是使用PowerManager.WakeLock的API來保持CPU工作并防止屏幕變暗關(guān)閉。這使得手機可以被喚醒,執(zhí)行工作,然后回到睡眠狀態(tài)。知道如何獲取WakeLock是簡單的,可是及時釋放WakeLock也是非常重要的,不恰當(dāng)?shù)氖褂肳akeLock會導(dǎo)致嚴重錯誤。例如網(wǎng)絡(luò)請求的數(shù)據(jù)返回時間不確定,導(dǎo)致本來只需要10s的事情一直等待了1個小時,這樣會使得電量白白浪費了。這也是為何使用帶超時參數(shù)的wakelock.acquice()方法是很關(guān)鍵的。但是僅僅設(shè)置超時并不足夠解決問題,例如設(shè)置多長的超時比較合適?什么時候進行重試等等?
解決上面的問題,正確的方式可能是使用非精準(zhǔn)定時器。通常情況下,我們會設(shè)定一個時間進行某個操作,但是動態(tài)修改這個時間也許會更好。例如,如果有另外一個程序需要比你設(shè)定的時間晚5分鐘喚醒,最好能夠等到那個時候,兩個任務(wù)捆綁一起同時進行,這就是非精確定時器的核心工作原理。我們可以定制計劃的任務(wù),可是系統(tǒng)如果檢測到一個更好的時間,它可以推遲你的任務(wù),以節(jié)省電量消耗。

這正是JobScheduler API所做的事情。它會根據(jù)當(dāng)前的情況與任務(wù),組合出理想的喚醒時間,例如等到正在充電或者連接到WiFi的時候,或者集中任務(wù)一起執(zhí)行。我們可以通過這個API實現(xiàn)很多免費的調(diào)度算法。
從Android 5.0開始發(fā)布了Battery History Tool,它可以查看程序被喚醒的頻率,又誰喚醒的,持續(xù)了多長的時間,這些信息都可以獲取到。
請關(guān)注程序的電量消耗,用戶可以通過手機的設(shè)置選項觀察到那些耗電量大戶,并可能決定卸載他們。所以盡量減少程序的電量消耗是非常有必要的。