Android 耗电统计的显示
2016-05-10 本文已影响1616人
wbxjack
原因
公司的项目要过移动测试,需要提供类似手机管家的应用。所以需要把省电管理这块加进去,另外要按照硬件和软件分别显示耗电的排行。
工作量
由于不在直接在Setting里面改动。那么单独在APP中要把setting中电池里面的排行移植过来。Setting中显示这些信息的地方在PowerUsageSummary.java中(继承PreferenceFragment)。而在我们的app中不使用Preference需要使用ExpandableListView来分层显示硬件和软件的电量排行,所以主要的工作量是把电量统计相关的代码移植过来。
主要涉及的类
- BatteryStatsHelper -- 计算所有应用的耗电(A helper class for retrieving the power usage information for all applications and services.)
- PowerProfile -- 实际是从xml(power_profile.xml)中读出里各个硬件cpu,屏幕蓝牙wifi之类的耗电基值(记录每种硬件1秒钟耗多少电)。这样,根据各个应用的运行时间就可以算出耗电了。(Reports power consumption values for various device activities. Reads values from an XML file.)
- BatterySipper -- 具体的uid对应的电量消耗(Contains power usage of an application, system service, or hardware type)
- BatteryStats(abstract) 实际用的是BatteryStatsImpl(providing access to battery usage statistics, including information on wakelocks, processes, packages, and services.)
- BatteryEntry -- 对应的包名和icon,作为UI的数据来源。(Wraps the power usage data of a BatterySipper with information about package name and icon image)
刷新流程 -- PowerUsageSummary中refreshStats函数
- 首先,调用mStatsHelper.refreshStats()来刷新当前的电量统计
- 然后mStatsHelper.getUsageList()返回BatterySipper的数组,每个BatterySipper代表一个应用(uid)的消耗的电量信息
- 根据BatterySipper的信息生成BatteryEntry产生数据,剩下的就是怎么根据BatteryEntry来显示了。
总结
基本上把上面的逻辑拿出来,放到app中,ExpandableListView配合BaseExpandableListAdapter来完成显示。所以难度不大,是搬砖的活。但是背后的framework中battery相关类和service确实很复杂。看出来谷歌在电量统计上还是做了不少工作。算是有个大概了解了。有机会自己分析一下framework中是怎么统计电量了。
网上搜了几篇不错的文章,如下:
Android BatteryStatsHelper深入理解(and5.1)
Android应用的耗电量统计