博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 8.0 电池->耗电详情-01
阅读量:4147 次
发布时间:2019-05-25

本文共 4620 字,大约阅读时间需要 15 分钟。

0. 介绍

主要介绍UI位置和基本函数入口,其中耗电详情与power_profile.xml息息相关

1. UI 界面

应用电量

2. 源码

2.1 设置界面入口

PowerUsageSummary->getPreferenceScreenResId()

package com.android.settings.fuelgauge;/** * Displays a list of apps and subsystems that consume power, ordered by how much power was * consumed since the last time it was unplugged. */public class PowerUsageSummary extends PowerUsageBase implements        AnomalyDialogListener, OnLongClickListener, OnClickListener {
@Override protected int getPreferenceScreenResId() { return R.xml.power_usage_summary; }

2.2 UI 布局

R.xml.power_usage_summary

"充满电(
^1
前)后的应用用电量"

上述即 key 为 app_list 为耗电详情列表

2.3 耗电详情 app_list

PowerUsageSummary.java

private static final String KEY_APP_LIST = "app_list";    @Override    public void onCreate(Bundle icicle) {        super.onCreate(icicle);        ...        mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST);

2.4 耗电数据填充

  • PowerUsageSummary->refreshAppListGroup, 显示耗电详情
  • PowerUsageSummary->addNotAvailableMessage, 显示没有电池使用数据
private void refreshAppListGroup() {        ...        mAppListGroup.addPreference(notAvailable);        ...    }    private void addNotAvailableMessage() {        final String NOT_AVAILABLE = "not_available";        Preference notAvailable = getCachedPreference(NOT_AVAILABLE);        if (notAvailable == null) {            notAvailable = new Preference(getPrefContext());            notAvailable.setKey(NOT_AVAILABLE);            // 
"没有电池使用数据。"
notAvailable.setTitle(R.string.power_usage_not_available); mAppListGroup.addPreference(notAvailable); } }

2.5 refreshAppListGroup 数据处理

2.5.1 条件判断-功耗参考文件

PowerUsageSummary->refreshAppListGroup

// 是否使用假数据    private static final boolean USE_FAKE_DATA = false;    // 背光电流的最小值    private static final int MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP = 10;    private void refreshAppListGroup() {        // 获取背光亮度功率        final double averagePower = powerProfile.getAveragePower(PowerProfile.POWER_SCREEN_FULL);        if (averagePower >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP || USE_FAKE_DATA) {            // 这里要求平均电流需要大于 10, 要求我们需要配置 power_profile.xml 文件的电流数据            // frameworks\base\core\res\res\xml\power_profile.xml 厂商根据功耗电流进行配置,否则该项数据始终为无            final List
usageList = getCoalescedUsageList( USE_FAKE_DATA ? getFakeStats() : mStatsHelper.getUsageList()); }

小知识

文件路径在于:frameworks\base\core\java\com\android\internal\os\PowerProfile.java文件路径:frameworks\base\core\res\res\xml\power_profile.xml    /**     * Power consumption at full backlight brightness. If the backlight is at     * 50% brightness, then this should be multiplied by 0.5     */    public static final String POWER_SCREEN_FULL = "screen.full";    
0.1
2.5.2 功耗文件,获取假数据

PowerUsageSummary-> getFakeStats()

private static List
getFakeStats() { ArrayList
stats = new ArrayList<>(); float use = 5; for (DrainType type : DrainType.values()) { if (type == DrainType.APP) { continue; } stats.add(new BatterySipper(type, null, use)); use += 5; } for (int i = 0; i < 100; i++) { stats.add(new BatterySipper(DrainType.APP, new FakeUid(Process.FIRST_APPLICATION_UID + i), use)); } stats.add(new BatterySipper(DrainType.APP, new FakeUid(0), use)); // Simulate dex2oat process. BatterySipper sipper = new BatterySipper(DrainType.APP, new FakeUid(UserHandle.getSharedAppGid(Process.FIRST_APPLICATION_UID)), 10.0f); sipper.packageWithHighestDrain = "dex2oat"; stats.add(sipper); sipper = new BatterySipper(DrainType.APP, new FakeUid(UserHandle.getSharedAppGid(Process.FIRST_APPLICATION_UID + 1)), 10.0f); sipper.packageWithHighestDrain = "dex2oat"; stats.add(sipper); sipper = new BatterySipper(DrainType.APP, new FakeUid(UserHandle.getSharedAppGid(Process.LOG_UID)), 9.0f); stats.add(sipper); return stats; }
2.5.3 功耗文件,获取功耗数据

frameworks/base/core/java/com/android/internal/os/BatteryStatsHelper.java

BatteryStatsHelper->getUsageList()

/**     * List of apps using power.     */    private final List
mUsageList = new ArrayList<>(); public List
getUsageList() { return mUsageList; } public void refreshStats(int statsType, SparseArray
asUsers, long rawRealtimeUs, long rawUptimeUs) { ... mUsageList.add(index, bs); ... }
你可能感兴趣的文章
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
万年历
查看>>
作为码农你希望面试官当场指出你错误么?有面试官这样遭到投诉!
查看>>
好多程序员都认为写ppt是很虚的技能,可事实真的是这样么?
查看>>
如果按照代码行数发薪水会怎样?码农:我能刷到公司破产!
查看>>
程序员失误造成服务停用3小时,只得到半月辞退补偿,发帖喊冤
查看>>
码农:很多人称我“技术”,感觉这是不尊重!纠正无果后果断辞职
查看>>
php程序员看过来,这老外是在吐糟你吗?看看你中了几点!
查看>>
为什么说程序员是“培训班出来的”就是鄙视呢?
查看>>
码农吐糟同事:写代码低调点不行么?空格回车键与你有仇吗?
查看>>
阿里p8程序员四年提交6000次代码的确有功,但一次错误让人唏嘘!
查看>>
一道技术问题引起的遐想,最后得出结论技术的本质是多么的朴实!
查看>>
985硕士:非科班自学编程感觉还不如培训班出来的,硕士白读了?
查看>>
你准备写代码到多少岁?程序员们是这么回答的!
查看>>
码农:和产品对一天需求,产品经理的需求是对完了,可我代码呢?
查看>>
程序员过年回家该怎么给亲戚朋友解释自己的职业?
查看>>
技术架构师的日常工作是什么?网友:搭框架,写公共方法?
查看>>
第四章 微信飞机大战
查看>>
九度:题目1008:最短路径问题
查看>>
九度Online Judge
查看>>