- 用户层面: 如何查看和管理自己手机的电池使用情况。
- 开发者层面: 如何在 App 中检测电池状态,优化电池消耗。
- 系统/Root 层面: 如何获取更底层的电池信息。
用户层面:如何检测和管理手机电池
这是大多数用户最关心和最常用的方法,主要通过手机自带的系统设置和一些第三方 App 来实现。

A. 使用系统自带工具
这是最直接、最可靠的方法。
电池设置菜单
路径通常是:设置 -> 电池 或 设置 -> 电池和性能。
在这个菜单里,你可以看到:
- 电池使用情况: 这是核心功能,它会按时间(如过去 24 小时或几天)列出各个应用消耗电量的百分比,通常还会区分“后台活动”、“前台活动”、“唤醒锁定”等,帮助你了解应用是如何消耗电量的。
- 电池健康: (较新的 Android 版本和手机厂商支持) 显示电池的最大容量与原始容量的百分比,并给出“良好”、“需要维护”等评估。
- 耗电排行: 清晰地列出谁是“耗电大户”。
- 电池优化: 你可以在这里手动为某些应用设置“不受限制”或“优化”,防止它们在后台过度耗电。
- 预估剩余时间: 根据当前使用情况,估算电池还能使用多久。
开发者选项中的“电池历史记录”
这是一个更强大的工具,但普通用户可能用不到。
路径:设置 -> 关于手机 -> 连续点击“版本号”7次启用开发者选项 -> 设置 -> 系统 -> 开发者选项 -> 电池历史记录。

它提供了非常详细的、基于时间的电池消耗数据,可以精确到每个组件(如 CPU、网络、传感器)的耗电情况,主要用于开发者调试。
查看电池详情 在电池设置里,通常可以点击某个应用,查看它的详细耗电情况,
- 屏幕使用时间: 该应用在前台时屏幕亮了多久。
- 后台使用时间: 该应用在后台运行了多久。
- 唤醒次数: 该应用是否频繁唤醒手机 CPU。
B. 使用第三方 App
第三方 App 提供了更多样化的视图和额外功能。
AccuBattery 这是最著名的电池检测 App 之一。

- 功能:
- 电池健康估算: 通过多次完整的充放电循环,估算电池的实际健康容量。
- 充电速度监控: 显示当前的充电速度(毫安 mA)。
- 电池温度监控: 实时显示电池温度。
- 充电历史记录: 记录每次充电的开始/结束时间、充电量等。
- 原理: 它通过监测电池的电压和电流来估算容量,需要多次充放电才能得到比较准确的结果。
GSam Battery Monitor 功能比 AccuBattery 更偏向于技术分析。
- 功能:
- 详细的耗电树: 以树状图的形式展示每个进程、每个服务的耗电情况,非常深入。
- 唤醒锁监控: 精确记录哪些应用或服务持有了唤醒锁,导致 CPU 无法休眠。
- 内核唤醒监控: 监控由内核层面引起的事件。
- 适用人群: 对手机耗电有深入研究需求的用户和开发者。
系统/第三方工具箱类 App 如 《太极》、《冰箱》 等,它们的核心功能是“应用冻结”,可以一键冻结不常用的应用,使其完全不消耗任何资源(包括电量),是管理后台耗电的利器。
开发者层面:如何在 App 中检测电池状态
作为 App 开发者,了解电池状态对于优化应用性能、减少不必要的后台活动、提升用户体验至关重要。
Android 提供了 BatteryManager 这个类来获取电池信息,主要通过 Intent.ACTION_BATTERY_CHANGED 这个广播来接收电池状态的更新。
核心步骤:
-
在
AndroidManifest.xml中声明权限:<uses-permission android:name="android.permission.BATTERY_STATS" />
注意:从 Android 13 (API 33) 开始,读取精确的电池百分比需要
android.permission.BATTERY_STATS权限,这是一个普通权限,系统会自动授予,但更底层的信息可能需要特殊权限或仅限系统应用。 -
创建广播接收器来监听电池变化: 在
Activity或Service中注册一个BroadcastReceiver来监听ACTION_BATTERY_CHANGED。// 在 Activity 或 Service 中 private BroadcastReceiver batteryReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { // 获取电池电量 int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPercentage = level * 100.0f / scale; Log.d("BatteryInfo", "当前电量: " + batteryPercentage + "%"); // 获取电池状态 int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; Log.d("BatteryInfo", "是否在充电: " + isCharging); // 获取充电类型 int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean isUsbCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean isAcCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; Log.d("BatteryInfo", "USB充电: " + isUsbCharging + ", AC充电: " + isAcCharging); } } }; // 注册广播接收器 @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); registerReceiver(batteryReceiver, filter); } // 注销广播接收器 @Override protected void onPause() { super.onPause(); unregisterReceiver(batteryReceiver); }
常用的 BatteryManager Extra:
| Extra Key | 数据类型 | 描述 |
|---|---|---|
EXTRA_LEVEL |
int |
当前电池电量等级 (0-scale)。 |
EXTRA_SCALE |
int |
电池电量的最大值 (通常是100)。 |
EXTRA_STATUS |
int |
电池状态,如 BATTERY_STATUS_CHARGING, BATTERY_STATUS_DISCHARGING, BATTERY_STATUS_NOT_CHARGING, BATTERY_STATUS_FULL。 |
EXTRA_HEALTH |
int |
电池健康状态,如 BATTERY_HEALTH_GOOD, BATTERY_HEALTH_OVERHEAT, BATTERY_HEALTH_DEAD。 |
EXTRA_ICON_SMALL |
int |
一个小图标资源 ID,表示电池状态。 |
EXTRA_PLUGGED |
int |
连接的电源类型,如 BATTERY_PLUGGED_AC, BATTERY_PLUGGED_USB, BATTERY_PLUGGED_WIRELESS。 |
EXTRA_PRESENT |
boolean |
电池是否存在。 |
EXTRA_TECHNOLOGY |
String |
电池技术,如 "Li-ion"。 |
EXTRA_TEMPERATURE |
int |
电池温度,单位是十分之一摄氏度 (e.g., 250 表示 25.0°C)。 |
EXTRA_VOLTAGE |
int |
电池电压,单位是毫伏。 |
高级功能:Battery Saver (省电模式)
你还可以检测系统是否开启了省电模式,以便主动降低你的 App 的性能或后台活动。
// 获取省电模式是否开启
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_POWER_SAVE_MODE_CHANGED);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean isPowerSaveMode = PowerManager.isPowerSaveMode(context);
Log.d("PowerSave", "省电模式已开启: " + isPowerSaveMode);
// 在这里执行相应的优化逻辑
}
}, filter);
系统/Root 层面:获取更底层的电池信息
如果你有 Root 权限,或者你正在开发一个系统级 App,你可以访问 /sys/class/power_supply/ 目录下的文件,这里包含了 Linux 内核直接提供的、未经 Android 框架封装的电池信息。
如何访问:
使用 adb shell 或 Root 后的终端,进入 /sys/class/power_supply/battery/ 目录。
常用文件示例:
capacity: 当前电量百分比。cat /sys/class/power_supply/battery/capacity
status: 当前状态 (如 "Charging", "Discharging", "Full")。cat /sys/class/power_supply/battery/status
current_now: 当前电流,单位是微安,正值表示放电,负值表示充电。cat /sys/class/power_supply/battery/current_now
voltage_now: 当前电压,单位是微伏。cat /sys/class/power_supply/battery/voltage_now
temp: 当前温度,单位是摄氏度。cat /sys/class/power_supply/battery/temp
注意:
- 直接读取这些文件需要 Root 权限或
adb shell的权限。 - 不同厂商的设备,文件路径和文件名可能略有不同(可能是
bq27xxx而不是battery)。 - 这种方法绕过了 Android 的 API,适用于需要精确、实时数据的高级场景。
| 层面 | 工具/方法 | 目标 |
|---|---|---|
| 用户 | 设置 -> 电池 |
快速查看耗电大户、电池健康、优化设置 |
AccuBattery |
估算电池健康容量、监控充电速度 | |
GSam Battery Monitor |
深入分析耗电原因、监控唤醒锁 | |
| 开发者 | BatteryManager API |
在 App 中获取电量、状态、充电类型等信息,以优化应用行为 |
PowerManager.isPowerSaveMode() |
检测系统省电模式,主动降低性能 | |
| 系统/Root | /sys/class/power_supply/ |
获取最底层的、实时的电流、电压、温度等硬件数据 |
选择哪种方法取决于你的具体需求,普通用户用系统设置和 AccuBattery 就足够了,开发者需要掌握 BatteryManager API,而深度爱好者或系统开发者则会探索 /sys 文件系统。
