✅ 一、可获取的信息
通过 Android 的电池广播,你可以拿到:
| 信息 | 说明 |
|---|---|
| 当前电量 level | 当前电量百分比 |
| 电量最大值 scale | 一般 100 |
| 是否在充电 | AC / USB / 无线充电 |
| 充电开始 / 充电结束 | 通过广播监听 |
| 电池健康状态 | good、overheat 等 |
| 电池温度 | 部分机型支持 |
✅ 二、获取当前电量(无需注册广播)
Android 推荐方式:
val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager
val batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
batteryLevel即为 0--100 的电量百分比兼容 Android 5--16。
✅ 三、监听开始充电 / 结束充电(广播方式)
Android 使用以下广播:
✓ ACTION_BATTERY_CHANGED(粘性广播,不需要手动注册)
✓ ACTION_POWER_CONNECTED ------ 插上电源(开始充电)
✓ ACTION_POWER_DISCONNECTED ------ 拔掉电源(停止充电)
🔥 四、实际可用代码(Kotlin)
1. 监听充电状态的 BroadcastReceiver
class BatteryReceiver(private val callback: (BatteryEvent) -> Unit) : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
Intent.ACTION_POWER_CONNECTED -> {
callback(BatteryEvent.ChargeStart)
}
Intent.ACTION_POWER_DISCONNECTED -> {
callback(BatteryEvent.ChargeStop)
}
Intent.ACTION_BATTERY_CHANGED -> {
val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100)
val status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
val isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL
val percent = level * 100 / scale
callback(BatteryEvent.BatteryInfo(percent, isCharging))
}
}
}
}
sealed class BatteryEvent {
data object ChargeStart : BatteryEvent()
data object ChargeStop : BatteryEvent()
data class BatteryInfo(val level: Int, val isCharging: Boolean) : BatteryEvent()
}
2. 在 Activity / Service 中注册
val receiver = BatteryReceiver { event ->
when (event) {
is BatteryEvent.ChargeStart -> Log.d("Battery", "开始充电")
is BatteryEvent.ChargeStop -> Log.d("Battery", "停止充电")
is BatteryEvent.BatteryInfo -> Log.d("Battery", "电量=${event.level}%, 是否充电=${event.isCharging}")
}
}
val filter = IntentFilter().apply {
addAction(Intent.ACTION_BATTERY_CHANGED)
addAction(Intent.ACTION_POWER_CONNECTED)
addAction(Intent.ACTION_POWER_DISCONNECTED)
}
registerReceiver(receiver, filter)
🔥 五、Java 写法
public class BatteryReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_POWER_CONNECTED.equals(action)) {
Log.d("Battery", "开始充电");
} else if (Intent.ACTION_POWER_DISCONNECTED.equals(action)) {
Log.d("Battery", "停止充电");
} else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int percent = level * 100 / scale;
Log.d("Battery", "电量=" + percent + "% 是否充电=" + isCharging);
}
}
}
注册:
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
registerReceiver(new BatteryReceiver(), filter);
🟦 六、注意事项
✔ 无需权限
获取电量/充电状态 不需要任何危险权限。
✔ ACTION_BATTERY_CHANGED 是粘性广播
不需要手动发送,一调用 registerReceiver() 就能拿到当前电量。
✔ Android 10--16 完全兼容
这些电池广播没有废弃,可直接用。
⭐ 七、如果你需要"首次进入页面就知道状态"
可以用:
val intent = Context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
即可直接拿:
val level = intent?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val status = intent?.getIntExtra(BatteryManager.EXTRA_STATUS, -1)