關(guān)注能耗,讓應(yīng)用不做電耗子

手機耗電的主要原因:

  • 大數(shù)據(jù)量的傳輸;
  • 不停的在網(wǎng)絡(luò)間切換;
  • 解析大量的文本數(shù)據(jù);
  • 內(nèi)存泄漏

電量統(tǒng)計公式

  • 應(yīng)用運行總時間 = 應(yīng)用在Linux內(nèi)核態(tài)運行時間 + 應(yīng)用在Linux用戶態(tài)運行時間`
  • CPU工作總時間 = 軟件運行期間CPU每個頻率下工作的時間之和比例`
  • 應(yīng)用消耗的電量 = CPU每個頻率等級下工作的時間比例/CPU工作總時間 * 應(yīng)用運行總時間`


    設(shè)置中的電量排行

官方優(yōu)化建議

  • 1:在需要網(wǎng)絡(luò)連接的程序中,首先檢查網(wǎng)絡(luò)連接是否正常,如果沒有網(wǎng)絡(luò)連接,那么就不需要執(zhí)行相應(yīng)的程序;
  • 2:判斷網(wǎng)絡(luò)類型,針對特定的數(shù)據(jù)在特定的網(wǎng)絡(luò)下請求.例如:大量數(shù)據(jù)傳輸?shù)臅r候在wifi下請求;wifi下下載數(shù)據(jù)耗電量只有2/3/4G的1/3.
  • 3:使用效率高的數(shù)據(jù)格式和解析方法,推薦使用JSON/ProtocolBuffer/FlutterBuffer;
  • 4:在進行大數(shù)據(jù)量下載時,盡量使用GZIP方式下載;
  • 5:使用推送,代替循環(huán)請求
  • 6:盡量不要使用浮點運算
  • 7:避免內(nèi)存抖動,減少GC的工作頻率。例如不要在for循環(huán)、onDraw方法中創(chuàng)建對象;無法避免的可以創(chuàng)建對象池,然后在不使用的時候釋放;
  • 8:對定位要求不是太高的話盡量不要使用GPS定位,可以使用wifi和移動網(wǎng)絡(luò)cell定位即可;
  • 9:對于需要經(jīng)常獲取的信息可以使用緩存技術(shù),不需要進行多次請求;
  • 10:用JobScheduler 替代AlarmManager/WakeLock/Object#sleep()的定時任務(wù);

關(guān)注電量變化,在充電/電量過低時調(diào)整邏輯

  • 在開始使用耗電模塊時考慮電量情況,例如電量過低時不要開啟gps定位

    BatteryManager batteryManager = (BatteryManager)getSystemService(BATTERY_SERVICE);
    得到電量數(shù)值,在0-100范圍內(nèi)
    int battery = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
    
  • 在耗電時監(jiān)聽電池電量顯著變化,可以注冊廣播 Intent.ACTION_BATTERY_LOW / Intent.ACTION_BATTERY_OKAY實現(xiàn)

  • 此外還可以注冊廣播 Intent.ACTION_POWER_CONNECTED / Intent.ACTION_POWER_DISCONNECTED監(jiān)聽充電行為

    public class PowerConnectionReceiver extends BroadcastReceiver {
      public static final ACTION_01 = Intent.ACTION_POWER_CONNECTED;
      public static final ACTION_02 = Intent.ACTION_POWER_DISCONNECTED;
    
      @Override
      public void onReceive(Context context, Intent intent) {
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        是否在充電 = (status == BatteryManager.BATTERY_STATUS_CHARGING) || status == BatteryManager.BATTERY_STATUS_FULL;
        充電類型 = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        USB充電 = (充電類型 == BATTERY_PLUGGED_USB);
        AC電源充電 = (充電類型 == BATTERY_PLUGGED_AC);
      }
    }
    

使用Android Lint Tool規(guī)范代碼,排查問題

  • Android Sutido 集成的代碼規(guī)范提示工具,用來檢測代碼、xml布局文件、去除多余資源

    參考:/frameworks/base/services/core/java/com/android/server/job/controllers/BatteryController.java
    參考:https://developer.android.google.cn/topic/performance/power

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容