1 . PowerUsageSummary.java

onCreate方法

@Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mStatsHelper.create(icicle);

addPreferencesFromResource(R.xml.power_usage_summary);
        mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST);
        setHasOptionsMenu(true);

// M: power usage extends features
// 电源使用扩展功能
        mPowerUsageExts = new PowerUsageExts(getActivity(), mAppListGroup);
    }

refreshStats方法

private void refreshStats() {
        mAppListGroup.removeAll();
//是否添加该组的“偏好”孩子。
        mAppListGroup.setOrderingAsAdded(false);

// M: power usage extends features
//电力使用延伸功能
        mPowerUsageExts.initPowerUsageExtItems();

//上次充满后的电量使用情况
        mHistPref = new BatteryHistoryPreference(getActivity(), mStatsHelper.getStats(),
                mStatsHelper.getBatteryBroadcast());
        mHistPref.setOrder(-1);
//现在mHistPref是否在mAppListGroup
        mAppListGroup.addPreference(mHistPref);
        boolean addedSome = false;
//每个器件的平均耗电
        final PowerProfile powerProfile = mStatsHelper.getPowerProfile();
//stats:统计电量
        final BatteryStats stats = mStatsHelper.getStats();
//averagePower = powerProfile.getAveragePower()获取消耗电量
        final double averagePower = powerProfile.getAveragePower(PowerProfile.POWER_SCREEN_FULL);
        if (averagePower >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP) {//如果没有配置原生的power_profile.xml,这里的averagePower 为0.1
            final List<UserHandle> profiles = mUm.getUserProfiles();

mStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, profiles);

final List<BatterySipper> usageList = mStatsHelper.getUsageList();//获取各个耗电

//BatteryStatsService统计各个的时间会在usb线拔掉后清零,dichargeaAmount相当于usb拔掉后这段时间的电量,相当于电池使用的量
//mStatsType的值为BatteryStats.STATS_SINCE_CHARGED,代表了我们的计算规则是从上次充满电后数据,
       //还有一种规则是STATS_SINCE_UNPLUGGED是拔掉USB线后的数据
//dischargeAmount:上次充满电后消耗的电量
            final int dischargeAmount = stats != null ? stats.getDischargeAmount(mStatsType) : 0;
            final int numSippers = usageList.size();
            for (int i = 0; i < numSippers; i++) {
                final BatterySipper sipper = usageList.get(i);
//MIN_POWER_THRESHOLD_MILLI_AMP:最小功率门槛
                if ((sipper.value * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP) {//BatterySipper 的power都是以每小时计的
                    continue;
                }
//和上面一样(sipper.value / mStatsHelper.getTotalPower()统计的值,代表是该统计占该段时间内总的消耗电量的一个比,
//而该段时间是就是BatteryStats统计的时间,因此这段时间统计的电量还要乘以一个,这段时间内消耗的电量比上总电量的一个值。
//而且这个消耗电量的统计在BatteryStatsImpl中,当充电时,会把该项消耗电量统计下。  
                final double percentOfTotal =
                        ((sipper.value / mStatsHelper.getTotalPower()) * dischargeAmount);
                if (((int) (percentOfTotal + .5)) < 1) {
                    continue;
                }
                if (sipper.drainType == BatterySipper.DrainType.OVERCOUNTED) {
                    // Don't show over-counted unless it is at least 2/3 the size of
                    // the largest real entry, and its percent of total is more significant
                    if (sipper.value < ((mStatsHelper.getMaxRealPower()*2)/3)) {
                        continue;
                    }
                    if (percentOfTotal < 10) {
                        continue;
                    }
                    if ("user".equals(Build.TYPE)) {
                        continue;
                    }
                }
                if (sipper.drainType == BatterySipper.DrainType.UNACCOUNTED) {
                    // Don't show over-counted unless it is at least 1/2 the size of
                    // the largest real entry, and its percent of total is more significant
                    if (sipper.value < (mStatsHelper.getMaxRealPower()/2)) {
                        continue;
                    }
                    if (percentOfTotal < 5) {
                        continue;
                    }
                    if ("user".equals(Build.TYPE)) {
                        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();
    }

2.PowerUsageExts.java

initPowerUsageExtItems方法

    // init power usage extends items

// 初始化电源使用扩展项目
    public void initPowerUsageExtItems() {

//add by kelinxi begin 20150320
        if (BirdFeatureOption.BIRD_BATTERY_PERCENTAGE) {
            mBatterrPercentPrf = new CheckBoxPreference(mContext);
            mBatterrPercentPrf.setKey(KEY_BATTERY_PERCENTAGE);
            mBatterrPercentPrf.setTitle(mContext.getString(R.string.battery_percent));
//设置此首选项的默认值,如果持久性已关闭或持久性打开,并且在持久存储中未找到首选项,则将设置此偏好。
            mBatterrPercentPrf.setDefaultValue(false);
//设置此Preference是否持续。持久化时,它将其值存储到持久的SharedPreferences存储中。
//如果应该将其值存储到SharedPreferences中,请设置为true。
            mBatterrPercentPrf.setPersistent(false);
//设置相同级别上其他Preference对象的此Preference设置的顺序。
//如果未指定,则默认行为是按字母顺序排列。 
//setOrderingAsAdded(boolean)可以用于根据它们在XML中显示的顺序来排序“首选项”对象。
//这个偏好的顺序。 首先显示较低的值。 使用DEFAULT_ORDER按字母顺序排序或允许从XML排序。
            mBatterrPercentPrf.setOrder(-3);
//在状态栏中打开/关闭电池百分比显示
//Settings.Secure.BATTERY_PERCENTAGE = "battery_percentage"
            final boolean enable = Settings.Secure.getInt(mContext.getContentResolver(),
                    Settings.Secure.BATTERY_PERCENTAGE, 0) != 0;
                    
            mAppListGroup.addPreference(mBatterrPercentPrf);
//把该复选框设置成enable,如果enble是true,则该复选框默认选择
            mBatterrPercentPrf.setChecked(enable);//#8816 ningzhiyu, setChecked after addPreference. 
        }
        //add by kelinxi end 20150320

// Power saving mode for op09
        mBatteryExt.loadPreference(mContext, mAppListGroup);

// background power saving
        if (FeatureOption.MTK_BG_POWER_SAVING_SUPPORT
                && FeatureOption.MTK_BG_POWER_SAVING_UI_SUPPORT) {
            mBgPowerSavingPrf = new SwitchPreference(mContext);
            mBgPowerSavingPrf.setKey(KEY_BACKGROUND_POWER_SAVING);
            mBgPowerSavingPrf.setTitle(R.string.bg_power_saving_title);
            mBgPowerSavingPrf.setOrder(-4);
            mBgPowerSavingPrf.setChecked(Settings.System.getInt(mContext.getContentResolver(),
                    Settings.System.BG_POWER_SAVING_ENABLE, 1) != 0);
            mAppListGroup.addPreference(mBgPowerSavingPrf);
        }
    }

3.BirdProviderUtils.java


public void loadCustomSecureSettings(SQLiteStatement stmt) {
        //ningzhiyu , add battery percentage default value
//添加电池百分比默认值
        loadIntegerSetting(stmt, Settings.Secure.BATTERY_PERCENTAGE, R.integer.battery_percentage_def);
}

4.bird_defaults.xml

<!-- 
    battery_percentage_def
    besure the   BIRD_BATTERY_PERCENTAGE is define in the mak file.
    0  default off
    1 default  on

battery_percentage_def
     所以BIRD_BATTERY_PERCENTAGE是在mak文件中定义的。
     0默认关闭
     1默认开启
-->    
    <integer name="battery_percentage_def">0</integer>
</resources>

状态栏电量百分比默认关闭相关推荐

  1. android电量百分比,Android P 状态栏显示电量百分比

    状态栏默认显示电量百分比 在Android P 的BatteryMeterView中有集成显示电量百分比相关代码,所以我们只需要将其显示控制条件默认打开就行. 在Settings的Battery的子页 ...

  2. android 10.0状态栏显示电量百分比

    1.概述 在10.0的系统产品开发中,对于系统默认的电池电量是不显示的,所以产品需求要求显示电池电量,方便知道当前电量,方便显示在电量不足的情况下可以及时充电,所以来实现这个功能 2.状态栏显示电量百 ...

  3. 改变默认字体大小和默认显示大小。默认开启电量百分比 。 漫游开关默认状态显示为开启,手机数据默认状态。流量节省(Data saver)默认状态

    vendor/mediatek/proprietary/packages/apps/SettingsProvider/ src/com/android/providers/settings/Datab ...

  4. 让状态栏上有显示电池电量百分比

    我们所使用的Android手机的状态栏上,一般都有电池电量百分比的显示,方便用户知悉手机剩余百分之多少电量!我们的P6S手持机和ITAB-01平板上需要下拉状态栏才能看到电池电量百分比: 为了让用户能 ...

  5. [高通MSM8953_64][Android10]默认关闭蓝牙以及开启蓝牙状态栏不显示图标

    文章目录 开发平台基本信息 问题描述 解决方法 1.默认关闭蓝牙 2.开启蓝牙状态栏不显示图标 开发平台基本信息 芯片: MSM8953_64 版本: Android 10 kernel: msm-4 ...

  6. Android系统默认显示电池电量百分比

    Android系统默认显示电池电量百分比 整理一下修该需求时候遇到的问题以及进行修改的思路: 需求:Android 11 让系统默认显示电池电量百分比 整理一下修该需求时候遇到的问题以及进行修改的思路 ...

  7. android6.0系统状态栏添加电量百分比

    1.系统状态栏添加电量百分比显示 我们要修改SystemUI这个应用,看过源码才知道,其实状态栏是分3个显示的, 锁屏的时候是一个,对应的类是KeyguardStatusBarView,它是一个Rel ...

  8. zuk 科学计算机,前沿科技:科普ZUK Z1电量百分比设置教程及在设置中加入快速启动开关教程...

    互联网是高科技的产物,是历史发展.社会进步.人类智慧的结晶:是人类迄今所拥有的容量最大.内容最广.传递速度最快的信息中心.全球每天有四亿人使用互联网,上网人数占世界人口的百分之6.互联网为我们了解时事 ...

  9. 红米android如何把电池百分比,红米5A电量百分比怎么设置 红米5A电池百分比显示教程...

    红米5A预装的基于安卓7.1定制的MIUI 9稳定版系统,其默认的电池电量是以椭圆显示,我们只能大致了解到红米5A的电量剩余情况,不过MIUI 9系统是支持电量百分比的形式显示的,这样可以相对直观的方 ...

最新文章

  1. 11g新特性:X$DBGALERTEXT一个很酷的内部视图
  2. mysql5.0varchar_MySQL中varchar类型在5.0.3后的变化
  3. The 'microsoft.jet.oledb.4.0' provider is not registered on the local machin
  4. 详细介绍jQuery.outerWidth() 函数具体用法
  5. typescript 学习
  6. devops f5_2017年排名前5的DevOps文章
  7. 平扫加重建什么意思_在这款“奸商模拟器”里,帮助战场老兵重建家园吧!
  8. python 如何快速判断列表是否相同_python如何判断两个list是否相等
  9. 史上最全正则表达式语法,文末附常用表达式!
  10. BZOJ 3689: 异或之 可持久化trie+堆
  11. Java--IDEA报错Project ‘org.springframework.boot:spring-boot-starter-parent:2.2.0.RELEAS
  12. win7无法打开计算机共享文件夹,win7共享文件夹怎么设置?win7共享文件夹无法访问...
  13. JSP完成添加商品时的图片上传
  14. 计算机图形学--实时光线追踪
  15. 自动化立体库能力分析——堆垛机(单深单货位Case1,双循环)
  16. 在SpringBoot中添加发送邮件功能
  17. 学前教育本科实践有计算机没,H学院学前教育本科专业“全实践”教学体系的优化.pdf...
  18. 【题解】LuoGu1133:教主的花园
  19. 翔谈设计模式——观察者模式
  20. 6大中文分词工具测试比较

热门文章

  1. 微信小程序基础之在微信上显示和体验小程序?
  2. 【鸟哥杂谈】三分钟完成腾讯云部署emqx,公网访问自己的mqtt服务器
  3. 建设用地预审中审批、核准和备案怎样区分
  4. 怎么批量的改变图片格式和大小
  5. 【算法】_013_矩阵乘法
  6. HIS(LIS、PACS、RIS、EMR)系统简介
  7. ADT Example
  8. tiup单机扩展多pd报错
  9. Android屏幕旋转,android实战项目实例
  10. Unity中刚体使用--坦克炮塔旋转