主要概括為如下四點(diǎn)
- 單項(xiàng)耗電百分比=(單項(xiàng)耗電量/總共耗電量)*總計(jì)耗電百分比
- 小于0.5%的項(xiàng)不顯示在列表中,采用四舍五入顯示百分比
- 當(dāng)處于充電狀態(tài)滿足以下四個(gè)條件時(shí)清空電量使用記錄:
(1)沒(méi)有自動(dòng)重置且之前充滿過(guò)電
(2)當(dāng)前電量大于90%
(3)上次掉電時(shí)(充電前)的電量小于20%,當(dāng)前電量大于80%
(4)總共耗電 大于200%,且電池記錄緩存已滿( 256*1024; // 256KB) - 當(dāng)電池充滿電不再充電時(shí),停止記錄電量使用記錄,并在下一次拔出USB/電源時(shí)清空記錄
代碼分析
Settings模塊 PowerUseageSummary.java
refreshStats()方法:
//某一項(xiàng)(屏幕\WIFI\BT..)耗電量的百分比計(jì)算公式 = (該項(xiàng)耗電量(mah)/總共耗電量(mah)) * 總計(jì)百分比
final double percentOfTotal = ((sipper.totalPowerMah / totalPower) * dischargeAmount);
...
if (((int) (percentOfTotal + .5)) < 1) { // 小于0.5%的耗電項(xiàng)不顯示
continue;
}
// 將該百分比設(shè)置到視圖中
pref.setPercent(percentOfMax, percentOfTotal);
// setPercent 實(shí)現(xiàn)如下:
mProgress = Utils.formatPercentage((int) (percentOfTotal + 0.5));//四舍五入
清空電量使用記錄
frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
1. setOnBatteryLocked 方法 (該方法只有在充電狀態(tài)變化時(shí)調(diào)用)
if (onBattery) { //在充電狀態(tài)進(jìn)行如下判斷
// We will reset our status if we are unplugging after the
// battery was last full, or the level is at 100, or
// we have gone through a significant charge (from a very low
// level to a now very high level).
boolean reset = false;
// 滿足如下四個(gè)條件則清空電量使用記錄
if (!mNoAutoReset && (oldStatus == BatteryManager.BATTERY_STATUS_FULL //沒(méi)有自動(dòng)重置且之前充滿過(guò)電
|| level >= 90 //當(dāng)前電量大于90%
|| (mDischargeCurrentLevel < 20 && level >= 80) //上次掉電時(shí)(充電前)的電量小于20%,當(dāng)前電量大于80%
|| (getHighDischargeAmountSinceCharge() >= 200 && mHistoryBuffer.dataSize() >= MAX_HISTORY_BUFFER))) { // 總共耗電 大于200,且電池記錄緩存已滿( 256*1024; // 256KB)
...
reset = true;
...
}
...
if (reset) {
mRecordingHistory = true;
startRecordingHistory(mSecRealtime, mSecUptime, reset);//重置電量使用記錄,開(kāi)始新的記錄
}
}
2. setBatteryStateLocked 方法
...
// 當(dāng)電池充滿電不再充電時(shí),停止記錄電量使用記錄,并在下一次拔出USB/電源時(shí)清空記錄
if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
// We don't record history while we are plugged in and fully charged.
// The next time we are unplugged, history will be cleared.
mRecordingHistory = DEBUG;// DEBUG = false
}