Android性能優化之電量消耗


電量其實是目前手持設備最寶貴的資源之一,大多數設備都需要不斷的充電來維持繼續使用。不幸的是,對於開發者來說,電量優化是他們最后才會考慮的的事情。但是可以確定的是,千萬不能讓你的應用成為消耗電量的大戶。

Purdue University研究了最受歡迎的一些應用的電量消耗,平均只有30%左右的電量是被程序最核心的方法例如繪制圖片,擺放布局等等所使用掉的,剩下的70%左右的電量是被上報數據,檢查位置信息,定時檢索后台廣告信息所使用掉的。如何平衡這兩者的電量消耗,就顯得非常重要了。

有下面一些措施能夠顯著減少電量的消耗:

  • 我們應該盡量減少喚醒屏幕的次數與持續的時間,使用WakeLock來處理喚醒的問題,能夠正確執行喚醒操作並根據設定及時關閉操作進入睡眠狀態。
  • 某些非必須馬上執行的操作,例如上傳歌曲,圖片處理等,可以等到設備處於充電狀態或者電量充足的時候才進行。
  • 觸發網絡請求的操作,每次都會保持無線信號持續一段時間,我們可以把零散的網絡請求打包進行一次操作,避免過多的無線信號引起的電量消耗。關於網絡請求引起無線信號的電量消耗,還可以參考這里http://hukai.me/android-training-course-in-chinese/connectivity/efficient-downloads/efficient-network-access.html

我們可以通過手機設置選項找到對應App的電量消耗統計數據。我們還可以通過Battery Historian Tool來查看詳細的電量消耗。

如果發現我們的App有電量消耗過多的問題,我們可以使用JobScheduler API來對一些任務進行定時處理,例如我們可以把那些任務重的操作等到手機處於充電狀態,或者是連接到WiFi的時候來處理。 關於JobScheduler的更多知識可以參考http://hukai.me/android-training-course-in-chinese/background-jobs/scheduling/index.html

14)Understanding Battery Drain on Android

電量消耗的計算與統計是一件麻煩而且矛盾的事情,記錄電量消耗本身也是一個費電量的事情。唯一可行的方案是使用第三方監測電量的設備,這樣才能夠獲取到真實的電量消耗。

當設備處於待機狀態時消耗的電量是極少的,以N5為例,打開飛行模式,可以待機接近1個月。可是點亮屏幕,硬件各個模塊就需要開始工作,這會需要消耗很多電量。

使用WakeLock或者JobScheduler喚醒設備處理定時的任務之后,一定要及時讓設備回到初始狀態。每次喚醒無線信號進行數據傳遞,都會消耗很多電量,它比WiFi等操作更加的耗電,詳情請關注http://hukai.me/android-training-course-in-chinese/connectivity/efficient-downloads/efficient-network-access.html

修復電量的消耗是另外一個很大的課題,這里就不展開繼續了。

15)Battery Drain and WakeLocks

高效的保留更多的電量與不斷促使用戶使用你的App會消耗電量,這是矛盾的選擇題。不過我們可以使用一些更好的辦法來平衡兩者。

假設你的手機里面裝了大量的社交類應用,即使手機處於待機狀態,也會經常被這些應用喚醒用來檢查同步新的數據信息。Android會不斷關閉各種硬件來延長手機的待機時間,首先屏幕會逐漸變暗直至關閉,然后CPU進入睡眠,這一切操作都是為了節約寶貴的電量資源。但是即使在這種睡眠狀態下,大多數應用還是會嘗試進行工作,他們將不斷的喚醒手機。一個最簡單的喚醒手機的方法是使用PowerManager.WakeLock的API來保持CPU工作並防止屏幕變暗關閉。這使得手機可以被喚醒,執行工作,然后回到睡眠狀態。知道如何獲取WakeLock是簡單的,可是及時釋放WakeLock也是非常重要的,不恰當的使用WakeLock會導致嚴重錯誤。例如網絡請求的數據返回時間不確定,導致本來只需要10s的事情一直等待了1個小時,這樣會使得電量白白浪費了。這也是為何使用帶超時參數的wakelock.acquice()方法是很關鍵的。但是僅僅設置超時並不足夠解決問題,例如設置多長的超時比較合適?什么時候進行重試等等?

解決上面的問題,正確的方式可能是使用非精准定時器。通常情況下,我們會設定一個時間進行某個操作,但是動態修改這個時間也許會更好。例如,如果有另外一個程序需要比你設定的時間晚5分鍾喚醒,最好能夠等到那個時候,兩個任務捆綁一起同時進行,這就是非精確定時器的核心工作原理。我們可以定制計划的任務,可是系統如果檢測到一個更好的時間,它可以推遲你的任務,以節省電量消耗。

這正是JobScheduler API所做的事情。它會根據當前的情況與任務,組合出理想的喚醒時間,例如等到正在充電或者連接到WiFi的時候,或者集中任務一起執行。我們可以通過這個API實現很多免費的調度算法。

從Android 5.0開始發布了Battery History Tool,它可以查看程序被喚醒的頻率,又誰喚醒的,持續了多長的時間,這些信息都可以獲取到。

請關注程序的電量消耗,用戶可以通過手機的設置選項觀察到那些耗電量大戶,並可能決定卸載他們。所以盡量減少程序的電量消耗是非常有必要的。




http://hukai.me/android-performance-patterns/


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com