【Android】电池统计机制和api
前言
在Android framework中,BatteryStatsHelper.java 是在 Android 5(API 23)时引入的用于电池统计的类,在 Android 8(API 26)以后改进,在 Android 12(API 31)以后引入更高效的电池统计接口 BatteryUsageStats.java 用于替代 BatteryStatsHelper.java 的部分功能,在 Android 13(API 32)之后正式废弃使用接口 BatteryStatsHelper.java,即 BatteryStatsHelper.java 只能在 Android 5(API 23)~Android 12(API 31)使用,而 BatteryUsageStats.java 只能在 Android 12(API 31)及之后使用。
BatteryUsageStats 更侧重于标准化数据输出,而 BatteryStatsHelper 提供更多底层细节(如唤醒锁统计)。
正文
权限模型
想要使用 BatteryStatsHelper.java,需要在 AndroidMenifest.xml 中声明以下权限:
<uses-permission android:name="android.permission.BATTERY_STATS" tools:ignore="ProtectedPermissions" />
想要使用 BatteryUsageStats.java,需要在 AndroidMenifest.xml 中声明以下权限:
<uses-permission android:name="android.permission.BATTERY_PREDICTION" />
<!-- 如果需要包名信息还需要 -->
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
替代方案
| 旧版 BatteryStatsHelper.java | 新版 BatteryUsageStats.java | 说明 |
|---|---|---|
| 通过 getUsageList() 获取耗电项 | 使用 BatteryUsageStats.getBatteryConsumers() | 新版返回 List |
查询指定应用的电池消耗情况
BatteryStatsHelper.java
// 加载自上次充电以来的数据(STATS_SINCE_CHARGED)
mBatteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, mUserManager.getUserProfiles());
// getUsageList() 返回所有应用的耗电项(BatterySipper),通过 UID 匹配目标应用。
List<BatterySipper> usageList = mBatteryStatsHelper.getUsageList();
for (BatterySipper sipper : usageList) {
if (sipper.getUid() == packageInfo.applicationInfo.uid) {
/**
* sipper.totalPowerMah:该应用的总耗电量(毫安时)。
* getTotalPower():设备总耗电量。
* dischargeAmount:电池放电量(单位可能为百分比或电量值)。
* 最终计算 percentOfMax 表示该应用耗电占比。
*/
int dischargeAmount = mBatteryStatsHelper.getStats().getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED);// 电池放电量
final int percentOfMax = (int) ((sipper.totalPowerMah) / mBatteryStatsHelper.getTotalPower() * dischargeAmount + .5f);// 应用耗电比
apppower = sipper.totalPowerMah;// 实际耗电量
}
}
BatteryUsageStats.java
// 初始化 BatteryStatsManager
BatteryStatsManager batteryStatsManager = context.getSystemService(BatteryStatsManager.class);
// 获取电池使用统计(自上次充电以来)
BatteryUsageStats usageStats = batteryStatsManager.getBatteryUsageStats(BatteryUsageStats.STATS_SINCE_LAST_CHARGE);
// 获取所有应用的电池消耗数据
List<BatteryConsumer> consumers = usageStats.getConsumers(BatteryUsageStats.CONSUMER_TYPE_APPS);
// 遍历匹配目标 UID
for (BatteryConsumer consumer : consumers) {
if (consumer.getUid() == packageInfo.applicationInfo.uid) {
// 获取该应用的总耗电量(毫安时)
double appPowerMah = consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_ANY);
// 计算占总耗电的百分比
double totalPowerMah = usageStats.getConsumedPower();
double percentOfMax = (appPowerMah / totalPowerMah) * 100;
// 记录结果
apppower = appPowerMah;
break;
}
}
浙公网安备 33010602011771号