本文将带你了解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频道!

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

  1. android ndk 多线程mk,NDK开发之Android.mk文件编写

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 现在我们把android稍微写复杂些.在项目根目录下创建一个lib1文件夹 结构如图: test10.h和test11. ...

  2. Android关掉多个activity,Android应用开发之Android Activity栈管理 制定关闭某一个Activity,关闭所有Activit...

    本文将带你了解Android应用开发之Android Activity栈管理  制定关闭某一个Activity,关闭所有Activit,希望本文对大家学Android有所帮助. 系统Api :打开新的 ...

  3. 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...

    本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...

  4. android添加截图功能,Android应用开发之Android 5.0及以上编程实现屏幕截图功能的方法...

    本文将带你了解Android应用开发Android 5.0及以上编程实现屏幕截图功能的方法,希望本文对大家学Android有所帮助. 本文实例讲述了Android   5.0及以上编程实现屏幕截图功能 ...

  5. android 图片横竖判断_Android应用开发之android 判断ImageView当前显示的是哪一张图片...

    本文将带你了解Android应用开发之android   判断ImageView当前显示的是哪一张图片,希望本文对大家学Android有所帮助. 判断ImageView当前显示的是哪一张图片 Java ...

  6. java edittext 输入监听_Android应用开发之Android EditText 监听用户输入完成的实例

    本文将带你了解Android应用开发Android EditText 监听用户输入完成的实例,希望本文对大家学Android有所帮助. 我们都知道, Android   EditText输入框,并没有 ...

  7. android图片保存形式,Android应用开发之Android ScrollView截图和图片保存到相册的方式...

    本文将带你了解Android应用开发之Android ScrollView截图和图片保存到相册的方式,希望本文对大家学Android有所帮助. 1.1首先来看你一种截取屏幕,这种代码有缺陷,只能截取一 ...

  8. android 开发art,Android应用开发之Android 系统启动原理(art 虚拟机)

    本文将带你了解Android应用开发之Android 系统启动原理(art 虚拟机),希望本文对大家学Android有所帮助. Android   系统启动原理(art 虚拟机) 一.虚拟机的启动 A ...

  9. android webview 太大,Android应用开发之Android WebView加载图片显示过大的处理教程(代码教程)...

    本文将带你了解Android应用开发Android  WebView加载图片显示过大的处理教程(代码教程),希望本文对大家学Android有所帮助. Webview加载图片时,经常会遇到图片显示不符合 ...

最新文章

  1. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
  2. 单片机检测stc没反应_STC 核心板 入门记 - 你好我叫郑某人
  3. 遭遇内存无法读写的错误
  4. 基于pythonselect.select模块通信的实例讲解
  5. Nginx Location 工作流程图及总结
  6. 等额本息和等额本金 计算公式
  7. 英文阅读新姿势:新版 Edge + 侧边翻译
  8. 互联网公司的裁员,能玩出多少种花样?
  9. 请问什么是AIX 5L的PTF?
  10. 特别篇:公主,快放开那只巨龙
  11. request to https://registry.npmjs.org/@angular%2fcli failed, reason: read ECONNRESET
  12. 苹果手机软件升级密码_安卓系统用久了会卡,苹果系统就能一直流畅?
  13. Generating Event Causality Hypotheses through Semantic Relation
  14. 【OpenCV】人脸检测和识别
  15. 快手安全 X 墨菲安全 | 软件供应链安全解决方案完整分享
  16. OpenStack常用运维命令手册-V1.0-黑夜青儿
  17. 第十二届蓝桥杯第二期模拟赛(java) python解法
  18. VUE设置浏览器icon图标
  19. 看《骇客帝国-重装上阵》说法语
  20. python判断性别的源代码_python 通过手机号识别出对应的微信性别(实例代码)

热门文章

  1. logistic公式形式的由来,从广义线性回归说起
  2. 存储过程 触发器 约束
  3. 页面中动态画有超连接的图
  4. 终于找到了满意的博客主题
  5. HTML5的优点与缺点
  6. Python一句话实现秦九韶算法快速计算多项式的值
  7. 详解Python项目开发时自定义模块中对象的导入和使用
  8. Python多线程编程中使用Barrier对象进行同步
  9. java定时任务_java:springBoot使用@Scheduled注解配置定时任务
  10. HTML页面加载顺序