确定当前充电状态
首先,确定当前充电状态。BatteryManagerBatteryManagerBatteryManager
会在一个包含充电状态的粘性Intent
中广播所有电池和充电详情。
由于它是一个粘性 Intent,因此您并不需要如下一代码段中所示的那样通过简单地调用registerReceiver
传入null
作为接收器来注册BroadcastReceiverBroadcastReceiverBroadcastReceiver
,便可返回当前电池状态 Intent。您可以在此处传入实际BroadcastReceiver
对象,但由于稍后我们将会处理更新,因此并不需要这样做。
val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->context.registerReceiver(null, ifilter)}
您可以提取当前充电状态,并且如果设备正在充电,则还可以提取设备是通过 USB 还是交流充电器进行充电。
val status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1val isCharging: Boolean = status == BatteryManager.BATTERY_STATUS_CHARGING|| status == BatteryManager.BATTERY_STATUS_FULL// 如何充电?val chargePlug: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1val usbCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_USBval acCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_AC
监控充电状态变化
就像设备可以轻松地插入电源,充电状态也很容易发生变化,因此必须监控充电状态的变化并相应地改变刷新频率。
每当设备连接或断开电源时,BatteryManager
都会广播一项操作。请务必接收这些事件,即便您的应用并未运行 - 尤其要考虑到这些事件可能会影响您启动应用以便发起后台更新的频率 - 因此您应在清单中注册一个BroadcastReceiver
,通过在一个 Intent 过滤器内定义ACTION_POWER_CONNECTED
和ACTION_POWER_DISCONNECTED
来同时监听这两种事件。
<receiver android:name=".PowerConnectionReceiver"><intent-filter><action android:name="android.intent.action.ACTION_POWER_CONNECTED"/><action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/></intent-filter></receiver>
确定当前电池电量
您可以通过从电池状态 intent 提取当前电池电量和刻度来了解当前电池电量,如下所示:
val batteryPct: Float? = batteryStatus?.let { intent ->val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)level * 100 / scale.toFloat()}