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

업데이트가 배터리 수명에 미치는 영향을 줄이기 위해 백그라운드 업데이트 빈도를 변경할 때는 현재 배터리 수준과 충전 상태를 확인하는 것이 좋습니다.

애플리케이션 업데이트 실행 시 배터리 수명에 미치는 영향은 기기의 배터리 수준과 충전 상태에 따라 다릅니다. 기기가 AC를 통해 충전될 때 업데이트 실행으로 인한 영향은 미미하므로, 대부분의 경우 기기가 전원 콘센트에 연결되어 있으면 화면 재생 빈도를 극대화할 수 있습니다. 반대로 기기가 방전되고 있으면 업데이트 비율을 낮추면 배터리 수명을 늘리는 데 도움이 됩니다.

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

현재 충전 상태 확인

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

고정 인텐트이므로 BroadcastReceiver를 등록할 필요가 없습니다. 다음 스니펫과 같이 registerReceiver를 호출하여 null를 수신기로 전달하면 현재 배터리 상태 인텐트가 반환됩니다. 여기서 실제 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나 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

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;

일반적으로 기기가 AC 충전기에 연결된 경우에는 백그라운드 업데이트 비율을 최대화하고, USB를 통해 충전하는 경우에는 비율을 낮춥니다. 배터리가 방전되고 있을 때는 비율을 더 낮춥니다.

충전 상태의 변화 모니터링

충전 상태는 기기를 연결하는 것처럼 쉽게 변경될 수 있으므로 충전 상태의 변화를 모니터링하고 그에 따라 화면 재생 빈도를 변경하는 것이 중요합니다.

BatteryManager는 기기가 전원에 연결되거나 연결 해제될 때마다 작업을 브로드캐스트합니다. 앱이 실행되지 않는 동안에도 이러한 이벤트를 수신하는 것이 중요합니다. 특히 백그라운드 업데이트를 시작하기 위해 이러한 이벤트가 앱을 시작하는 빈도에 영향을 미치기 때문입니다. 따라서 인텐트 필터 내에서 ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED를 정의하여 두 이벤트를 모두 수신 대기하도록 매니페스트에 BroadcastReceiver를 등록해야 합니다.

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

Java

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

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

배터리 수준의 주요 변화 모니터링

배터리 상태를 지속적으로 모니터링하는 일은 어렵지만 그리할 필요가 없습니다.

일반적으로 배터리 수준을 지속적으로 모니터링하는 것은 앱의 일반적인 동작보다 배터리에 더 큰 영향을 미치므로 배터리 수준의 중요한 변화(특히 기기가 배터리 부족 상태로 전환되거나 부족할 때)만 모니터링하는 것이 좋습니다.

아래 매니페스트 스니펫은 broadcast receiver 내의 인텐트 필터 요소에서 추출됩니다. 수신기는 ACTION_BATTERY_LOWACTION_BATTERY_OKAY를 수신 대기하여 기기 배터리가 부족하거나 저전력 상태에서 나갈 때마다 트리거됩니다.

<receiver android:name=".BatteryLevelReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BATTERY_LOW"/>
    <action android:name="android.intent.action.BATTERY_OKAY"/>
  </intent-filter>
</receiver>

일반적으로 배터리가 매우 부족할 때는 모든 백그라운드 업데이트를 사용 중지하는 것이 좋습니다. 휴대전화를 사용하기 전에 전화가 꺼지면 데이터가 최신 상태라도 상관없습니다.

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