1. 程式人生 > >Android螢幕卡頓,電量損耗和Service常駐小結

Android螢幕卡頓,電量損耗和Service常駐小結

一、螢幕出現卡頓的原因:
表面原因:
1、在UI主執行緒中執行比如像網路下載等耗時的操作,致使CPU沒有能力在16ms內完成對下一幀顯示資料的處理
2、需要顯示的介面太過複雜,比如佈局的層次較深,介面控制元件過多等,給CPU與GPU的渲染造成壓力
3、手機硬體GPU、CPU處理能力有限,FPS低於16ms,造成卡頓
4、單個幀處理事件內JVM GC次數過多,GC 次數過多可能佔用較多的CPU處理時間。而造成GC次數過多的原因可能有:1)記憶體抖動,即短時間內大量物件被建立又立即被銷燬;2)瞬間建立大量物件,佔用過多記憶體,使得JVM不得不提前進行GC來回收記憶體空間。

一次繪製任務耗時20ms,那麼在16ms系統發出訊號時就無法繪製,該幀就被丟棄,等待下次訊號才開始繪製,導致16*2ms之內都顯示同一幀畫面.

解決方法:
1、降低介面的佈局複雜度以及控制元件數量,優化介面佈局(使用Hierarchy Viewer工具來分析)
1)使用include來重用layout ,merge減少巢狀
2)使用viewStub來延遲介面載入(相對於gone,viewstub只有在需要時才會被載入,而第一次載入後,viewStub就會轉化為一個普通控制元件)
2、採用非同步處理的方式,避免將耗時的任務放在UI執行緒中進行處理。
3、儘量減少Overdraw (使用Android開發者工具中的Enable GPU Overdraw來判斷介面Overdraw的次數)
4、良好的Java程式設計習慣,避免建立大量的短生命週期物件(避免發生記憶體抖動的情況)。

二、減少電量損耗的措施:

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

三、Android保證Service不被殺死:
1、設定persistent屬性為true,設定為常駐應用;系統啟動時,ActivityManagerService會通讀取系統中所有persistent是true的應用,然後得到一個List,並設定一個監聽器,一但應用掛掉,會回撥這個監聽器相應的方法,如果是persistent為true的應用,則會重啟。
2、重寫onStartCommand方法,onStartCommand方法有三種返回值,設定返回值為START_STICKY;,當Service因為異常或者記憶體緊張被系統殺死時,會立即重啟;
3、設定為前臺程序,提高Service的優先順序,避免因為low memory而被系統殺死;
4、流氓用法:設定兩個Service相關聯,當一個Service被清理掉時,在onDestory中重啟另一個Service
5、廣播接收器
6、類似QQ一畫素
7、在onDestroy()中重啟Service服務。但是通過別人應用,如360直接kill掉我的應用時,是不會呼叫Service的ondestory方法的。