一.Android省電開發之性能優化
電量優化
Android應用開發中的網絡、定位、傳感器等都是比較耗電的特性,我們應該正確使用API來有效降低應用的耗電量。
1.BroadcastReceiver:
在代碼實現中需要盡量避免無用操作代碼的執行,減少應用損耗的電量。
對於BroadcastReceiver,通常的做法是在界面onPasuse之后取消廣播監聽器的監聽操作,同時根據具體業務需求選擇當應用位於后台時是否禁用廣播接收器。
2.數據傳輸:
數據傳輸方式:藍牙傳輸,Wi-Fi傳輸,移動網絡傳輸等。
優化:
后台數據傳輸的管理:根據具體業務需求,嚴格限制應用位於后台時是否禁用某些數據傳輸,盡量能夠避免無效的數據傳輸。
數據傳輸的頻度問題:通過經驗值或者數據統計的方法確定好數據傳輸的頻度,避免冗余重復的數據傳輸,數據傳輸過程中要壓縮數據大小,合並網絡請求,避免輪詢等。
3.位置服務:
三種位置服務:
GPS定位:通過接收全球定位系統的衛星提供的經緯度坐標信息實現位置服務,精度是最高的,通常在10米以內,在時間和電量的消耗上也是最高的。
網絡定位:通過移動通信的基站信號差異來計算出手機所在的位置,精度比GPS定位差很多,通常在幾百米范圍內。
被動定位:最省電的定位服務,如果應用使用被動定位服務,這個應用會等待手機中其他應用、服務或者系統組件發出定位請求,並和這些組件的監聽器一起接收位置更新。
正確有限地使用位置服務器,減少應用耗電量。所以在代碼中使用位置服務時,需要注意:
有沒有及時注銷位置監聽器:長時間的監聽位置更新會耗費大量的電量,通過可以選擇在頁面的onPasuse中進行注銷操作,更好用且全局有效的做法是禁用位置監聽器。
位置更新監聽頻率的設定:根據具體的業務需求設置一個合適的更新頻率值,通常需要在定位精度和耗電量之間綜合考慮。
多種位置服務的選擇:綜合考慮應用的具體需求在不同時機采用不同的定位服務或者選擇第三方的定位SDK。
4.AlarmManager:
AlarmManager的喚醒操作是比較耗電的,通常情況下需要保證兩次喚醒操作的時間間隔不要太短,在不需要使用喚醒功能的情況下盡早取消AlarmManager,否則應用會一直處於耗電狀態。
5.WakeLock:
使用WakeLock時,需要切記及時釋放鎖,而且通常情況下,要盡早地釋放WakeLock。保持屏幕常量
在屏幕關閉之后,系統休眠,一些任務可能會被暫停(Timer、Handler、Thread、Service),但是某些情況下我們需要保持屏幕常量,或者不需要屏幕常量但是需要CPU一直執行,直到任務的執行完成,那么我們可以手動設置屏幕常亮!//在Acitivty里面使用Flag
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); FLAG_KEEP_SCREEN_ON的好處是使用方便,不要額外的權限!
Android為了節省電量,會在用戶無操作一段時間之后進入休眠狀態。Wake Lock是一種鎖的機制,只要有人拿着這個鎖,系統就無法進入休眠。一些App為了能在后台持續做事情,就會持有一個WakeLock,那么手機就不會進入休眠狀態,App要做的事情能做了,但是也更加耗電。
- App在前台不要申請WakeLock,此時無需申請,申請的話會計算到應用電量消耗;
- App在后台由於業務需要必須要申請WakeLock時使用帶有超時參數的方法,防止由於忘記或者異常情況下沒有釋放;
- App申請使用WakeLock,任務結束之后及時釋放,讓系統再次進入休眠狀態。
-
PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
-
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,TAG);
-
wl.acquire(TIMEOUT); // 使用帶有超時參數的acquire方法 // ... do work...
-
wl.release();
二.Android省電開發之CPU降頻
眾所周知,在android系統的耗電量排行里,cpu的耗電占 了比較大的一部分比例,也就是說,cpu的使用率和使用頻率將直接或間接的影響電量的分配和使用,但很遺憾,android-sdk中沒有為 android的開發者提供類似cpu管理的功能,但是當下很多省電類應用或專業的cpu管理軟件都提供了cpu的降頻甚至是超頻的功能。
三.Android省電開發之service
Android應用開發中,難免會遇到service開發。android中服務是運行在后台的東西,級別與activity差不多。既然說service是運行在后台的服務,那么它就是不可見的,沒有界面 的東西。Service和其他組件一樣,都是運行在主線程中,因此不能用它來做耗時的請求或者動作。你可以在服務中開一一個線程,在線程中做耗時動作。
我們從三個方面來淺析一下service的省電開發
1. 查看service是否存活以及降低優先級:
假如一個service工作完成,但是來不及關掉或者kill掉,用戶又看不見,所以這個service將會一直在后台運行,勢必耗電。所以我們可以降低某些不常用service進程的優先級,在系統內存吃緊的情況下, 進程優先級低的service容易被系統kill掉。除此之外,可以利用監聽系統廣播來判斷service狀態是否存活,死亡即可手動kill掉。
2. 用IntentService代替Service開發:
普通服務一旦啟動之后,就會一直處於運行狀態,必須調用stopService()或者stopSelf()方法才能讓服務停止下來。為了簡單的創建一個異步的、會自動挺值得服務,Android專門提供了一個IntentService類。IntentService在運行完畢后自動停止,減少耗電量。
3. 后台執行的定時任務Alarm機制:
Service沒必要一直在后台運行,這時候的定時任務顯得很重要。Android的定時任務有兩種實現方式,Timer類和Alarm機制。Timer有一個明顯的短板,不適合長期后台運行的定時任務。為了能讓電池更加耐用,每種手機都會有自己的休眠策略,Android手機就會在長時間不操作的情況下自動讓CPU進入到睡眠狀態,這就有可能導致Timer中的定時任務無法正常運行。而Alarm機制則不存在這種情況,它具有喚醒CPU的功能,即可以保證每次需要執行定時任務的時候CPU能正常工作。重點來了:從Android 4.4之后,Alarm任務的觸發時間將會變得不准確,有可能會延遲一段時間后任務才能得到執行。這不是bug,而是系統在耗電性方面進行的優化。系統會自動檢測目前有多少Alarm任務存在,然后將觸發時間將近的幾個任務放在一起執行,這就可以大幅度的減少CPU被喚醒的次數,從而有效延長電池的使用時間。
四.Android省電開發之網絡
除了常規的異步網絡、多線程技術、本地緩存等等之外,Android省電開發還有一個重要的方面是:wifi比蜂窩數據,包括2G(GPRS)、3G更省電:a)盡量在Wi-Fi下傳輸數據,當然這是廢話,不過可以考慮在有Wi-Fi的時候做預加載,比如應用中心的zip包、手Q web類應用的離線資源等;b)非Wi-Fi下,盡量減少網絡訪問,每一次后台交互都要考慮是否必須。雖然WiFi接入方式已經占到移動互聯網用戶的50%,但是是有些手機設置為待機關閉WiFi連接,即便有Wi-Fi信號也只能切換到蜂窩數據;
看了一篇博文,上面數據測試,也不知道正確與否,但是能說明一定的問題。滅屏情況:滅屏傳輸,高負載download的時候WiFi最省電(70mA),3G(270mA)和2G(280mA)相當,是WiFi的4倍左右;亮屏情況:亮屏傳輸,高負載download的時候WiFi最省電(280mA),3G(360mA)和2G(370mA)相當,是WiFi的1.3倍左右;所以在Android應用省電開發中,我們可以在獲取網絡方式的方面加以考慮。
五.Android省電開發之Android L5.0(ART)登場
1. 默認的ART運行模式
最新的安卓4.4系統中引入了全新的ART模式嗎,相比之前流行已久的Dalvik模式有了很大的改變。因此LZ為大家制作了以下這張ART模式和Dalvik模式區別對比圖表,通過對比,可以一眼看出 ART模式和Dalvik模式之間的區別。

這篇博客寫的很好http://www.cnblogs.com/shaweng/p/3811461.html
在Dalvik中,應用每次運行,字節碼都需要通過即時編譯器轉換為機器碼,這回拖慢應用的運行效率,而在ART環境中,應用在第一次安裝時,字節碼就會預先編譯成機器碼,使其成為了真正的本地應用。這個過程叫做預編譯。這樣的話,應用的啟動和執行都會變得更加快速。但是ART的缺點是預編譯完的機器人占用了更大的存儲空間,應用的安裝需要更長的時間。但是犧牲空間時間換取省電速度,在Android應用中還是可以接受的,畢竟性能的提升,運行速度的變快,體驗更流暢,電池續航更久顯得更重要。
經測試,谷歌最新的Android L系統與上一版本相比續航能力可以提升36%。
Android 5.0的亮點http://lib.91.com/comments/141029/21755059.html
2. 利用JobScheduler API
過去,如果開發人員想通過后台調取服務器數據,或完成某些處理工作,應用程序必須先監聽是否有事件正在發生,並為自己設定一個喚醒時間,一旦應用程序開始運行,他需要檢查各種環境條件,以確定是否具備條件讓它完成工作,還是需要稍后再試,這種方式不僅復雜,而且容易出錯,它會不斷的浪費資源,比如當 一個應用程序被喚醒后,發現條件不符合就只能去睡覺並為下次喚醒再次設定時間,這是一個反復的過程。
這個問題,將引用JobScheduler來修復,它作為一個調度應用程序,負責當應用程序被喚醒時,提供適當的運行環境,所以開發者不用再讓程序檢測環境是否符合需求,開發人員只需要按照標准的流程來,調度程序會自動為喚醒的程序,准備好運行環境。應用程序可以使用這個調度程序,來喚醒他們,比如當設備連接到充電器后,調度程序將喚醒那些需要處理器工作的程序,讓他們進行工作,或者在設備連接至WiFi網絡的時候上傳下載照片,更新內容等。該調度程序還支持一個時間窗口,以便它可以喚醒一組應用程序,這將使那些不需要精確喚醒時間,但每隔一兩小時需要運行一次的程序能在同一時間點運行,這樣就能讓處理器保持更長時間的休眠。
JobScheduler的優勢相當巨大,它不僅可以幫助手機節省電量, 實際由於不在需要監聽,更改和設置報警,還可以幫助開發人員減少代碼書寫量。目前該JobScheduler類,已經加入Android L開發者預覽版。
3. 各種省電新模式和新技術
(1) 全新的Material Design風格用戶界面;
新的用戶界面更加簡潔、色彩更加豐富。動畫效果更加合理生動,同時加入實時陰影的3D視圖,更多的使用卡片風格的顯示效果。全平台風格也變得更為統一。
(2) 新的通知消息系統;
允許用戶管理通知中心中的通知消息。原先的Android通知欄幾乎是處於無法控制的狀態,所有的應用通知都會彈出,要想關閉只能進到每一個應用中去單獨設置,或是使用第三方軟件來實現統一管理。但是現在不用了,Android 5.0已經自帶了通知管理界面。
(3) 多任務界面有着全新的Google Now卡片風格;
通知中心融入更多的卡片式風格,即使是在鎖屏狀態下也可以進行多種功能操作。同時用戶可以自定義通知的優先級別,使得用戶不會錯過任何重要的通知。還可以設置特定的通知權限,只有被允許的通知消息才會推送。同時還具有操作性,比如用戶在游戲時有電話打入,不會以全屏顯示,而是彈出可操作的通知卡片,用戶可選擇接聽或拒接,不影響游戲繼續進行。
(4) Project Volta省電模式、BatterySaver省電模式;
Android 5.0的省電模式是通過JobSchedulerAPI以及自動調節屏幕亮度、刷新率來達到省電的效果,而且還使用了Project Volta量化每個應用的耗電量,在手機快沒電的情況下主動降低CPU的主頻或者關閉通訊模塊,以獲得更長的待機時間。還配備了一個Battery Bistorian電池歷史記錄功能,可讓詳細顯示設備的耗電情況。
