监控电池电量和充电状态

当你通过改变后台更新的频率来降低更新频率时 电池寿命更新,查看当前电池电量和充电状态是 start 的值。

执行应用程序更新对电池续航时间的影响取决于电池电量和 设备的充电状态。设备通过交流电充电时执行更新的影响 可以忽略不计,因此在大多数情况下,您可以在连接设备时最大限度地提高刷新率 墙上的充电器。相反,如果设备正在放电,降低更新频率有助于 以延长电池寿命。

同理,您也可以检查电池电量,可能降低充电频率或 甚至在电池电量几乎耗尽时更新您的更新。

确定当前充电状态

首先,确定当前充电状态。BatteryManager 在粘性 Intent 中广播所有电池和充电详情,其中包括 充电状态

由于它是粘性 intent,因此您无需注册 BroadcastReceiver,只需调用 registerReceiver 并传入即可 null 作为接收器,则当前电池状态 intent 为 返回。您可以在此处传入实际的 BroadcastReceiver 对象, 我们将在后面的部分中处理更新,因此并不需要这样做。

Kotlin

val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->
    context.registerReceiver(null, ifilter)
}

Java

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

您可以提取当前充电状态,如果设备正在充电,还可以提取设备是否正在充电 设备正在通过 USB 或交流充电器进行充电:

Kotlin

val status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
val isCharging: Boolean = status == BatteryManager.BATTERY_STATUS_CHARGING
        || status == BatteryManager.BATTERY_STATUS_FULL

// How are we charging?
val chargePlug: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1
val usbCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_USB
val acCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_AC

Java

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

通常,如果设备处于活跃状态,您应最大限度提高后台更新的频率 连接到交流充电器时,如果通过 USB 充电,则降低充电频率 如果电池正在放电,则会进一步。

监控充电状态变化

就像设备可以轻松地插入电源一样,充电状态也很容易发生变化,因此请务必 监控充电状态变化,并相应地改变刷新频率。

每当设备处于连接或连接状态时,BatteryManager 都会广播一个操作 断开了电源。即使您的应用不是在内,接收这些事件也很重要 特别是这些事件会影响您为了启动应用而启动应用的频率 启动后台更新,因此您应该在清单中注册 BroadcastReceiver,以通过定义 intent 过滤器中的 ACTION_POWER_CONNECTEDACTION_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,如下所示:

Kotlin

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()
}

Java

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level * 100 / (float)scale;

对电池电量的重大变化做出反应

您无法轻松地持续监控电池状态,您也不必如此。

一般来说,监测电池电量的影响更大 超出应用正常行为对电池的影响。例如,注册一个 BroadcastReceiver(用于在电池电量不足时取消待处理工作) 这主要是为了进一步消耗电池电量(因此 不可能,因为 Android 8.0)。相反,您可以为工作提供约束条件,用于描述应该何时运行该作业, 使系统能够在不启动应用的情况下做出决定。

一般来说,最好不要在电池电量耗尽时运行后台更新 非常低。如果手机在您先关机之前自行关机,数据的新鲜度则无关紧要 以便于使用为此, 使用 WorkManager 库 具有 BatteryNotLow 限制条件 指定在电池电量不足时不应运行工作(除了 NetworkType 约束条件)。

在许多情况下,为设备充电与将设备插入基座是同一操作。下一个 课程介绍了如何确定当前基座状态并监控设备变化 停靠。