云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > Android BatteryStatsHelper深入理解(and5.1)

Android BatteryStatsHelper深入理解(and5.1)

  • 62 次阅读
  • 3 次下载
  • 2025/12/9 7:11:55

Log.e(\ continue; }

if (\ continue; } } final UserHandle userHandle = new UserHandle(UserHandle.getUserId(sipper.getUid()));

final BatteryEntry entry = new BatteryEntry(getActivity(), mHandler, mUm, sipper);

final Drawable badgedIcon = mUm.getBadgedIconForUser(entry.getIcon(), userHandle); final CharSequence contentDescription = mUm.getBadgedLabelForUser(entry.getLabel(), userHandle);

final PowerGaugePreference pref = new PowerGaugePreference(getActivity(), badgedIcon, contentDescription, entry);

final double percentOfMax = (sipper.value * 100) / mStatsHelper.getMaxPower(); sipper.percent = percentOfTotal; pref.setTitle(entry.getLabel()); pref.setOrder(i + 1);

pref.setPercent(percentOfMax, percentOfTotal); if (sipper.uidObj != null) {

pref.setKey(Integer.toString(sipper.uidObj.getUid())); }

addedSome = true;

mAppListGroup.addPreference(pref);

if (mAppListGroup.getPreferenceCount() > (MAX_ITEMS_TO_LIST + 1)) { break; } } }

if (!addedSome) {//如果走到这里会显示\没有电池数据\,要么power_profile.xml没有配置,要么每项都continue

addNotAvailableMessage(); }

BatteryEntry.startRequestQueue(); }

碰到一个问题当电池电量到90%,拔去usb线,settings会显示“没有电池使用数据”,带着这个问题,我们再来看看BatteryStatsImpl:

我们先来看看BatteryStatsHelper中refreshStats函数中的一段代码,如何统计mTotalPower,先会计算一个mComputedPower,会把每个usage的power累计相加,然后下面还有一段代码,mStats.getLowDischargeAmountSinceCharge是什么意思呢?带着这个问题再去看BatteryStatsImpl的代码。 [java] view plain copy

public void refreshStats(int statsType, SparseArray asUsers, long rawRealtimeUs, long rawUptimeUs) { 。。。。。。。。。。。。

mTotalPower = mComputedPower;

if (mStats.getLowDischargeAmountSinceCharge() > 1) {// if (mMinDrainedPower > mComputedPower) {

double amount = mMinDrainedPower - mComputedPower; mTotalPower = mMinDrainedPower;

addEntryNoTotal(BatterySipper.DrainType.UNACCOUNTED, 0, amount); } else if (mMaxDrainedPower < mComputedPower) {

double amount = mComputedPower - mMaxDrainedPower;

addEntryNoTotal(BatterySipper.DrainType.OVERCOUNTED, 0, amount); } }

Collections.sort(mUsageList); }

先看BatteryStatsImpl中getLowDischargeAmountSinceCharge函数,直接从代码中找哪里改变了这个变量mLowDischargeAmountSinceCharge [java] view plain copy @Override

public int getLowDischargeAmountSinceCharge() { synchronized(this) {

int val = mLowDischargeAmountSinceCharge;

if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) { val += mDischargeUnplugLevel-mDischargeCurrentLevel-1; }

return val; } }

发现在setOnBatteryLocked函数中会改变其值,而setOnBatteryLocked函数是有BatteryService调用,只有当充电方式改变才会掉,而我们这段代码代表,只有插上usb线会调用,level代表当前电量,mDischargeUnplugLevel代表上一次拔去usb线的电量,这就代表上次拔去usb线后,电量level减少了,就是耗电了,在这次充电的时候把之前的耗电统计下,放在mLowDischargeAmountSinceCharge 和mHighDischargeAmountSinceCharge 这两个变量中,这两个变量差1,就是有一个误差的范围而已。

[java] view plain copy

void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime, final boolean onBattery,

final int oldStatus, final int level) { else {

mOnBattery = mOnBatteryInternal = onBattery; pullPendingStateUpdatesLocked();

mHistoryCur.batteryLevel = (byte)level;

mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, \ + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(mSecRealtime, mSecUptime); mDischargeCurrentLevel = mDischargePlugLevel = level;

if (level < mDischargeUnplugLevel) {//level代表当前电量,mDischargeUnplugLevel代表上一次拔去usb线的电量

mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;//累计消耗的电量

mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level; }

updateDischargeScreenLevelsLocked(screenOn, screenOn); updateTimeBasesLocked(false, !screenOn, uptime, realtime); mNumChargeStepDurations = 0; mLastChargeStepLevel = level; mMaxChargeStepLevel = level; mLastChargeStepTime = -1;

mInitStepMode = mCurStepMode; mModStepMode = 0; }

现在我们再来看看getLowDischargeAmountSinceCharge函数。 [java] view plain copy @Override

public int getLowDischargeAmountSinceCharge() { synchronized(this) {

int val = mLowDischargeAmountSinceCharge;

if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {//表示现在正在用电状态,mDischargeCurrentLevel 变量代表用电的时候的电量,会时时更新,mDischargeUnplugLevel代表上一次拔去usb线的一个电量,也就是最近的一次消耗电量 val += mDiscwww.sm136.comhargeUnplugLevel-mDischargeCurrentLevel-1; }

return val; } }

最近一次的消耗电量加上之前累计的消耗电量就是总的消耗电量了。 下面看看几个关键变量

[java] view plain copy

void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime, final boolean onBattery,

final int oldStatus, final int level) { boolean doWrite = false;

Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE); m.arg1 = onBattery ? 1 : 0; mHandler.sendMessage(m);

final long uptime = mSecUptime * 1000; final long realtime = mSecRealtime * 1000;

final boolean screenOn = mScreenState == Display.STATE_ON; if (onBattery) { 。。。。。。。。。。

addHistoryRecordLocked(mSecRealtime, mSecUptime);

mDischargeCurrentLevel = mDischargeUnplugLevel = level;//刚拔去usb线的时候统计下mDischargeCurrentLevel和mDischargeUnplugLevel值 if (screenOn) {

mDischargeScreenOnUnplugLevel = level; mDischargeScreenOffUnplugLevel = 0; } else {

mDischargeScreenOnUnplugLevel = 0; mDischargeScreenOffUnplugLevel = level; }

mDischargeAmountScreenOn = 0; mDischargeAmountScreenOff = 0;

updateTimeBasesLocked(true, !screenOn, uptime, realtime); } else {

mOnBattery = mOnBatteryInternal = onBattery; pullPendingStateUpdatesLocked();

mHistoryCur.batteryLevel = (byte)level;

mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, \ + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(mSecRealtime, mSecUptime);

mDischargeCurrentLevel = mDischargePlugLevel = level;//刚插上usb线的时候统计下mDischargeCurrentLevel和mDischargePlugLevel值

setBatteryState是BatteryService时时调的,而setOnBatteryLocked只有充电方式改变后才会调用。

[java] view plain copy

public void setBatteryState(int status, int health, int plugType, int level, int temp, int volt) { synchronized(this) {

final boolean onBattery = plugType == BATTERY_PLUGGED_NONE;

搜索更多关于: Android BatteryStatsHelper深入理解 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

Log.e(\ continue; } if (\ continue; } } final UserHandle userHandle = new UserHandle(UserHandle.getUserId(sipper.getUid())); final BatteryEntry entry = new BatteryEntry(getActivity(), mHandler, mUm, sipper);

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com