一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android優化之電量優化的實現

Android優化之電量優化的實現

2022-03-11 15:24七適散人 Android

這篇文章主要介紹了Android優化之電量優化的實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Android 5.0 后用 Battery Historian 工具分析電量。

耗電因素

移動網絡請求

手機通過內置的射頻模塊和基站聯系,從而鏈接上網的,而這個射頻模塊(radio)是非常耗電的,為了控制這個射頻模塊的耗電,硬件驅動及 Android RIL 層做了很多處理。例如可以單獨關閉 radio(飛行模式),間歇性假休眠 radio(有數據發生時才上電,保持一個頻率的與基站交互)等等。如今的 App 都是移動互聯網 App,不可避免的會有大量的網絡請求,會導致 radio 一直處于活躍狀態,從而耗電量增加。

使用移動網絡傳輸數據,電量的消耗有以下 3 種狀態:

  • Full power:高功率狀態,移動網絡連接被激活,允許設備以最大 的傳輸速率進行操作。
  • Low power:低功耗狀態,對電量的消耗差不多是 Full power 狀態下的 50%。
  • Standby:空閑態,沒有數據連接需要傳輸,耗電最少。

從低功率到高功率大約 1.5s,從空閑態到高功率大約 2s,秒。在應用中每創建一個新的網絡連接,網絡(射頻)模塊都會轉換到高功率狀態(Radio Full Power),在數據傳輸完后再轉回低功耗狀態(Radio Low Power),轉換的過程需要 5 秒,這 5 秒的耗電量保持在高功率狀態,最后再轉換空閑態需要 12 秒。因此,對于一個典型的移動網絡設備,每個數據傳輸都會導致網絡模塊消耗 20 秒的電量。

WakeLock

Android 系統本身為了優化電量的使用,會在沒有操作時進入休眠狀態,來節省電量。當然,為了便于開發(很多應用不可避免的希望在滅屏后還能運行一些事兒,或是要保持屏幕一直亮著--比如播放視頻),Android 提供了一個 PowerManager.WakeLock 的東西.

我們可以用 WakeLock 來保持 CPU 運行,或是防止屏幕變暗/關閉,讓手機可以在用戶不操作時依然可以做一些事兒。然而,獲取 WakeLock 很容易,釋放不好就會成為難題,消耗電量。例如獲取了一個 WakeLock 來保持 CPU 運轉,做一個復雜運算并將數據上傳到后臺服務器,然后釋放該 WakeLock。然而這個過程可能并不像我們想象的那么快,可能因為比如服務器掛掉,計算出了異常等等導致 WakeLock 沒有釋放,CPU 會一直得不到休眠,而大大增加耗電。

另外,WakeLock 還有 android:keepScreenOn 屬性,還可以讓屏幕常量,這也是耗電大戶。

?
1
2
3
4
5
6
7
8
9
private void acquireWakeLock(Context ctx) {
  if (null == mWakeLock) {
    PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
    mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "TestLocknService");
    if (null != mWakeLock) {
      mWakeLock. acquire();
    }
  }
}
  • PARTIAL_WAKE_LOCK:保持 CPU 正常運轉,屏幕和鍵盤燈有可能 會關閉。
  • SCREEN_DIM_WAKE_LOCK:保持 CPU 運轉,允許保持屏幕顯示,但有可能變暗,允許關閉鍵盤燈。
  • SCREEN_BRIGHT_WAKE_LOCK:保持 CPU 運轉,允許保持屏幕高亮顯示,允許關閉鍵盤燈。
  • FULL_WAKE_LOCK:保持 CPU 運轉,保持屏幕高亮顯示,鍵盤燈也保持亮度。
  • ACQUIRE_CAUSES_ WAKEUP:強制使屏幕亮起,這種鎖主要用于一些必須通知用戶的操作。
  • ON_AFTER_RELEASE:當鎖被釋放時,保持屏幕亮起一段時間。

需要注冊權限

?
1
2
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>

GPS

應用中經常會用到定位服務,Android 提供了 Network 定位和 GPS 定位。相對來說,GPS 會精確得多,對于一些諸如跑步,導航類的應用基本會使用 GPS 定位。然而,GPS 定位也會消耗大量的電量。

AlarmManager

間隔不能太短。

優化建議

優化網絡請求

在蜂窩移動網絡下,最好做到批量執行網絡請求,盡量避免頻繁的間隔網絡請求,盡量多地保持在 Radio Standby 狀態。

盡量在 Wi-Fi 環境下使用數據傳輸。

謹慎使用 WakeLock

WakeLock 獲取釋放成對出現(調用 release),使用超時 WakeLock,以防出異常導致沒有釋放。

WakeLock 有一個接口 setReferenceCounted,用來設置 WakeLock 的計數機制,true 為計數,false 為不計數,默認是 true。所謂計數即每一個 acquire 必須對應一個 release;不計數則是無論有多少個 acquire,一個 release 就可以釋放。雖然官方說默認 是計數的,但有的第三方 ROM 做了修改,使默認是不計數的。

主動設置 wakeLock.setReferenceCounted(false)。

監聽手機充電狀態

BatteryManager 會發送一個包含充電狀態的持續廣播,我們可以通過此廣播獲取充電狀態和電量詳情。因為這是一個持續廣播,無需寫 Receiver,可以直接通過 intent 獲取相關數據。

?
1
2
3
4
5
6
7
8
9
10
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null,ifilter);
// 設備正在充電
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS,-1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
         status == BatteryManager.BATTERY_STATUS_FULL;
// 也可以監聽充電狀態的變化,只要設備連接或斷開電源,BatteryManager 就會廣播相應的操作
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);
boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;

另外頁可以注冊 Receiver來監聽

?
1
2
3
4
5
6
<receiver android:name=".PowerConnectionReceiver">
  <intent-filter>
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  </intent-filter>
</receiver>

Doze and App Standby

Android 6.0 提供了兩個用來節省電量的技術 Doze 和 App Standby。

  • Doze 瞌睡。如果設備閑置了一段較長時間,Doze 技術將通過延遲后臺網絡活動,CPU 運行等來減少電量損耗。
  • App Standy 應用待機。不是最近得到過用戶使用的 App,App Standy 將延緩這個應用的后臺網絡活動。

所有 Android 6.0 及以上的設備上,Doze and App Standby 都會運行。可能會影響 App 的運行,可以根據官方文檔適配。

可以在代碼中調起電量優化的設計頁面,讓用戶選擇是否將應用加入白名單,以在 Doze 模式下能夠做一些事情。

定位

定位中使用 GPS,及時關閉

?
1
2
// Remove the listener you previously added
locationManager.removeUpdates(locationListener);

計算優化

縮短代碼產生指令運行的時間,進而減少某個應用程序對 CPU 時間片 的總占用時間,進而減少單位時間內該應用程序占整個系統耗電的百分比。

浮點運算比整數運算更消耗 CPU 時間片,因此耗電也會增加,在編寫 代碼的過程中應該盡量減少浮點運算。

  • 除法變乘法。
  • 充分利用移位。
  • 查表法,直接使用映射關系,但這會增加內存占用,視情況而定。

熄屏后停止一些和 UI 效果有關的操作,比如動畫。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.jianshu.com/p/627554db9f60

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久这里只有精品无码3D | 双性受合不垅腿攻np | 国产一卡2卡3卡四卡精品网站 | 99精品视频在线观看 | 97社区| 日韩一级片在线观看 | 国产麻豆流白浆在线观看 | 九九99香蕉在线视频美国毛片 | 秋霞一级成人欧美理论 | 九色PORNY丨视频入口 | 国产香蕉一区二区在线观看 | 久久久精品成人免费看 | 免费一级片在线观看 | 欧美在线一二三区 | 精品视频一区在线观看 | 国产一级在线观看 | 91赵邦贺 | 久久国产乱子伦精品免费不卡 | 97色伦 | 潘金莲西门庆一级淫片aaaaaa | 精品在线免费观看视频 | 欧美亚洲欧美 | poren黑人 | 国内小情侣一二三区在线视频 | 星球大战成人h无删减版 | 欧美作爱福利免费观看视频 | 波多野结衣xxxxx在线播放 | 国产精品欧美在线观看 | 国产色资源 | se综合| 免费看1级伦理 | 日韩欧美中文字幕一区 | 60老妇性xxxxhd | 日韩 视频在线播放 | 国产日韩精品一区二区在线观看 | 国产乱子伦在线观看不卡 | 免费观看俄罗斯特黄特色 | aⅴ导航站| 久久久久久免费观看 | 亚欧洲乱码视频一二三区 | 人成网站在线观看 |