欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么在Android中優(yōu)化電量-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)怎么在Android中優(yōu)化電量,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司主營莒南網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),莒南h5小程序制作搭建,莒南網(wǎng)站營銷推廣歡迎莒南等地區(qū)企業(yè)咨詢

耗電因素

移動網(wǎng)絡(luò)請求

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

使用移動網(wǎng)絡(luò)傳輸數(shù)據(jù),電量的消耗有以下 3 種狀態(tài):

  • Full power:高功率狀態(tài),移動網(wǎng)絡(luò)連接被激活,允許設(shè)備以大 的傳輸速率進行操作。

  • Low power:低功耗狀態(tài),對電量的消耗差不多是 Full power 狀態(tài)下的 50%。

  • Standby:空閑態(tài),沒有數(shù)據(jù)連接需要傳輸,耗電最少。

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

WakeLock

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

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

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

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 正常運轉(zhuǎn),屏幕和鍵盤燈有可能 會關(guān)閉。

  • SCREEN_DIM_WAKE_LOCK:保持 CPU 運轉(zhuǎn),允許保持屏幕顯示,但有可能變暗,允許關(guān)閉鍵盤燈。

  • SCREEN_BRIGHT_WAKE_LOCK:保持 CPU 運轉(zhuǎn),允許保持屏幕高亮顯示,允許關(guān)閉鍵盤燈。

  • FULL_WAKE_LOCK:保持 CPU 運轉(zhuǎn),保持屏幕高亮顯示,鍵盤燈也保持亮度。

  • ACQUIRE_CAUSES_ WAKEUP:強制使屏幕亮起,這種鎖主要用于一些必須通知用戶的操作。

  • ON_AFTER_RELEASE:當鎖被釋放時,保持屏幕亮起一段時間。

需要注冊權(quán)限

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

GPS

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

AlarmManager

間隔不能太短。

優(yōu)化建議

優(yōu)化網(wǎng)絡(luò)請求

在蜂窩移動網(wǎng)絡(luò)下,最好做到批量執(zhí)行網(wǎng)絡(luò)請求,盡量避免頻繁的間隔網(wǎng)絡(luò)請求,盡量多地保持在 Radio Standby 狀態(tài)。

盡量在 Wi-Fi 環(huán)境下使用數(shù)據(jù)傳輸。

謹慎使用 WakeLock

WakeLock 獲取釋放成對出現(xiàn)(調(diào)用 release),使用超時 WakeLock,以防出異常導(dǎo)致沒有釋放。

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

主動設(shè)置 wakeLock.setReferenceCounted(false)。

監(jiān)聽手機充電狀態(tài)

BatteryManager 會發(fā)送一個包含充電狀態(tài)的持續(xù)廣播,我們可以通過此廣播獲取充電狀態(tài)和電量詳情。因為這是一個持續(xù)廣播,無需寫 Receiver,可以直接通過 intent 獲取相關(guān)數(shù)據(jù)。

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null,ifilter);
// 設(shè)備正在充電
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS,-1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
         status == BatteryManager.BATTERY_STATUS_FULL;
// 也可以監(jiān)聽充電狀態(tài)的變化,只要設(shè)備連接或斷開電源,BatteryManager 就會廣播相應(yīng)的操作
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);
boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;

另外頁可以注冊 Receiver來監(jiān)聽

<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 提供了兩個用來節(jié)省電量的技術(shù) Doze 和 App Standby。

  • Doze 瞌睡。如果設(shè)備閑置了一段較長時間,Doze 技術(shù)將通過延遲后臺網(wǎng)絡(luò)活動,CPU 運行等來減少電量損耗。

  • App Standy 應(yīng)用待機。不是最近得到過用戶使用的 App,App Standy 將延緩這個應(yīng)用的后臺網(wǎng)絡(luò)活動。

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

可以在代碼中調(diào)起電量優(yōu)化的設(shè)計頁面,讓用戶選擇是否將應(yīng)用加入白名單,以在 Doze 模式下能夠做一些事情。

定位

定位中使用 GPS,及時關(guān)閉

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

計算優(yōu)化

縮短代碼產(chǎn)生指令運行的時間,進而減少某個應(yīng)用程序?qū)?CPU 時間片 的總占用時間,進而減少單位時間內(nèi)該應(yīng)用程序占整個系統(tǒng)耗電的百分比。

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

  • 除法變乘法。

  • 充分利用移位。

  • 查表法,直接使用映射關(guān)系,但這會增加內(nèi)存占用,視情況而定。

看完上述內(nèi)容,你們對怎么在Android中優(yōu)化電量有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

文章標題:怎么在Android中優(yōu)化電量-創(chuàng)新互聯(lián)
當前URL:http://chinadenli.net/article16/cdoedg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護品牌網(wǎng)站建設(shè)電子商務(wù)品牌網(wǎng)站制作外貿(mào)網(wǎng)站建設(shè)網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司