[Android Framework] 8.1 Battery系列(五) 电量预计可用多长时间计算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FightFightFight/article/details/82628707

电量剩余使用时间值的计算和电量充满时间计算非常类似。

Settings中获取时间值的接口如下:

packages/apps/Settings/src/com/android/settings/fuelgauge/BatteryInfo.java

long prediction = discharging
        ? stats.computeBatteryTimeRemaining(elapsedRealtimeUs) : 0;

计算方法为BatteryStatsImpl的computeBatteryTimeRemaining()方法,该方法如下:

public long computeBatteryTimeRemaining(long curTime) {
    //如果mOnBattery为false,说明连接有充电器,因此不会计算直接返回
    if (!mOnBattery) {
        return -1;
    }
    //如果放电步数记录器中没有放电持续步数,说明当前还没有进行放电,返回
    if (mDischargeStepTracker.mNumStepDurations < 1) {
        return -1;
    }
    //获取每放一格电时所需的时间平均值
    long msPerLevel = mDischargeStepTracker.computeTimePerLevel();
    if (msPerLevel <= 0) {
        return -1;
    }
    //电量剩余使用时间 = 放一格电时所需的时间平均值 × 当前电量
    return (msPerLevel * mCurrentBatteryLevel) * 1000;
}

这个方法中,使用mDischargeStepTracker来记录没放一格电所持续的时间和所有放电步数,然后通过computeTimePerLevel()得到一个放一格电所需时间的平均值,最后采用如下公式完成计算:

电量剩余使用时间 = 放一格电时所需的时间平均值 × 当前电量

mDischargeStepTrackermChargeStepTracker一样,也是LevelStepTracker类的一个实例,用于记录放电时的持续时间、放电步数之和等,当电量下降时,在setBatteryStateLocked()方法中都会通过mDischargeStepTracker.addLevelSteps()来统计放电时长和放电次数之和,addLevelSteps()方法已经分析过,因此就不再详细说明了。详细分析在Battery系列(四) 电量还需多长时间充满时间计算 中。

这里再次总结下computeTimePerLevel()方法:

public long computeTimePerLevel() {
    final long[] steps = mStepDurations;//放电所需时长的数组
    final int numSteps = mNumStepDurations;//放电次数之和

    // For now we'll do a simple average across all steps.
    if (numSteps <= 0) {
        return -1;
    }
    long total = 0;
    for (int i=0; i<numSteps; i++) {
        //在第四篇中分析到,高48位存储其他信息,后16位才存储时长,因此清零
        total += steps[i] & STEP_LEVEL_TIME_MASK;//0x000000ffffffffffL
    }
    return total / numSteps;
}

猜你喜欢

转载自blog.csdn.net/FightFightFight/article/details/82628707