android 电量详情,Android应用开发之Android 8.0 电池-)耗电详情获取方法

本文将带你了解Android应用开发之Android 8.0 电池-)耗电详情获取方法,希望本文对大家学Android有所帮助。

Android 8.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

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

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

2.3 耗电详情 app_list

PowerUsageSummary.java

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

2.4 耗电数据填充

PowerUsageSummary->refreshAppListGroup, 显示耗电详情 PowerUsageSummary->addNotAvailableMessage, 显示没有电池使用数据

?123456789101112131415161718private 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 ListusageList =   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 ListgetFakeStats()   {  ArrayListstats = 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   ListmUsageList = new ArrayList<>(); public   ListgetUsageList() { return   mUsageList;} public void refreshStats(int statsType,   SparseArrayasUsers, long rawRealtimeUs, long rawUptimeUs)   { ... mUsageList.add(index, bs); ...}

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注移动开发之Android频道!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值