배터리 수준 및 충전 상태 모니터링

백그라운드 업데이트 빈도를 변경하여 업데이트의 영향을 줄이면 배터리 수명 업데이트, 현재 배터리 수준 및 충전 상태 확인은 시작합니다

애플리케이션 업데이트 수행이 배터리 수명에 미치는 영향은 배터리 수준과 충전 상태를 나타냅니다. 기기가 AC 전원으로 충전되는 동안 업데이트 수행의 영향 무시할 수 있는 정도이므로 대부분의 경우 기기가 연결되어 있을 때마다 화면 재생 빈도를 최대화할 수 있음 벽면 충전기에 연결할 수도 있습니다 반대로 기기가 방전되고 있는 경우에는 업데이트 비율을 낮추는 것이 좋습니다. 배터리 수명을 연장할 수 있습니다.

마찬가지로 배터리 충전 수준을 확인하여 배터리 충전 빈도를 줄일 수도 있습니다. 배터리 충전량이 거의 소진되었을 때 업데이트를 계속할 수 있습니다.

현재 충전 상태 확인

현재 충전 상태를 확인하는 작업부터 시작합니다. BatteryManager 고정 Intent에 모든 배터리 및 충전 세부정보를 브로드캐스트합니다. 충전 상태를 확인할 수 있습니다.

고정 인텐트이므로 BroadcastReceiver를 등록할 필요가 없습니다. 간단히 registerReceiver를 호출하여 null를 수신기로 사용하는 경우 현재 배터리 상태 인텐트는 다음과 같습니다. 반환합니다. 여기서 실제 BroadcastReceiver 객체를 전달할 수도 있지만 이후 섹션에서 업데이트를 처리할 것이므로 필요하지 않습니다.

Kotlin

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

자바

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

현재 충전 상태와 기기가 충전 중인 경우 USB 또는 AC 충전기를 통해 충전되는 경우:

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

자바

// 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;

일반적으로 기기가 다운될 경우에는 백그라운드 업데이트 비율을 극대화해야 합니다. AC 충전기에 연결된 상태에서 충전하는 경우 USB로 충전하는 경우 속도를 낮춥니다. 배터리 방전이 발생하면 더 멀리 떨어질 수 있습니다.

충전 상태의 변화 모니터링

충전 상태는 기기를 꽂는 것만큼 쉽게 변경할 수 있으므로 충전 상태 변화를 모니터링하고 그에 따라 화면 재생 빈도를 변경하세요.

BatteryManager는 기기가 연결되거나 전원에서 분리될 것입니다. 앱이 호출되지 않을 때도 이러한 이벤트를 수신하는 것이 중요합니다. 특히 이러한 이벤트가 앱 실행 빈도에 영향을 주어야 하므로 백그라운드 업데이트를 시작합니다. 따라서 매니페스트에 BroadcastReceiver를 등록하여 두 이벤트를 수신 대기하려면 인텐트 필터 내의 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>

현재 배터리 수준 확인

현재 배터리 수준을 확인하는 것이 유용할 때도 있습니다. 원하는 경우 배터리 충전량이 특정 수준 미만일 때 백그라운드 업데이트 비율을 조정할 수 있습니다.

다음에서 현재 배터리 수준과 크기를 추출하여 현재 배터리 충전 상태를 확인할 수 있습니다. 배터리 상태 인텐트를 업데이트합니다.

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

자바

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 제약 조건).

대부분 기기를 충전하는 동작은 기기를 도킹하는 것과 동시에 일어납니다. 다음 현재 도크 상태를 확인하고 기기의 변경사항을 모니터링하는 방법을 보여주는 과정 도킹할 수 있습니다.