Android应用电池用量监测开发:如何获取指定时段应用耗电数据?
可行实现思路
Android 8.0+ 依赖系统公开API
从Android 8.0(API 26)开始,系统开放了BatteryStatsManager和UsageStatsManager的官方接口,完全支持分应用的电池统计:- 权限准备:必须申请
android.permission.PACKAGE_USAGE_STATS权限,这个权限无法通过常规弹窗申请,得引导用户跳转到系统设置页开启——可以通过启动Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)实现。 - 获取电池数据:通过
context.getSystemService(BatteryStatsManager::class.java)拿到实例后,调用getBatteryUsageStats(),传入时间范围参数(比如要获取上次拔电后的数据,用BatteryStatsManager.STATS_SINCE_CHARGED)。返回的BatteryUsageStats集合里,每个AppBatteryUsageStats对象对应一个应用,能拿到该应用的电池消耗占比、后台耗电时长等核心数据。 - 配合获取屏幕使用时长:用
UsageStatsManager的queryUsageStats()方法,获取指定时段内应用的前台运行时长,和电池数据做对比即可。
- 权限准备:必须申请
自定义统计补充(针对特殊需求)
如果需要更灵活的自定义时段统计,或者兼容更低版本,可以结合系统广播做本地数据积累:- 监听
ACTION_BATTERY_CHANGED广播,实时获取系统电池的电压、电流、剩余电量等数据;同时监听应用启停相关的广播,结合ActivityManager获取前台应用。 - 记录每个应用在前台/后台的运行时段,再结合系统总耗电数据,按运行时长、CPU占用比例等维度分摊到各应用。这种方式精度不如系统API,但能实现自定义时段的统计逻辑。
- 监听
关于旧隐藏API的说明
旧的隐藏API(比如com.android.internal.os.BatteryStats)在Android 10+已经完全被限制,而且本身也无法精准统计单应用的时段耗电,完全不建议再用。像Gsam、AccuBattery这类应用,在Android 8+版本都是基于公开的BatteryStatsManager实现的,早期版本可能依赖了系统签名或特殊权限,但现在公开API已经能满足核心需求。
内容的提问来源于stack exchange,提问作者mahboob
相关产品推荐
相关产品推荐

