Skip to content

Most visited

Recently visited

navigation

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

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

애플리케이션 업데이트 수행으로 배터리 수명이 영향을 받는 정도는 기기의 배터리 수준과 충전 상태에 따라 달라집니다. 기기가 AC 전원에서 충전될 때 업데이트 수행이 미치는 영향은 무시할 만한 수준이므로, 대부분 기기가 콘센트에 연결되어 있으면 새로고침 비율을 최대화할 수 있습니다. 반대로 기기가 방전되고 있으면 업데이트 비율을 낮추는 것이 배터리 수명 연장에 좋습니다.

마찬가지로 배터리 충전 수준을 검사하고, 배터리 충전량이 거의 소모되었을 때 업데이트 빈도를 낮추거나 심지어 중단할 수도 있습니다.

현재 충전 상태 확인

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

접착식 인텐트이므로 BroadcastReceiver를 등록할 필요가 없습니다. 다음 스니펫에서와 같이 registerReceiver를 호출하여 null을 수신기로 전달하면 현재 배터리 상태 인텐트가 반환됩니다. 여기서 실제 BroadcastReceiver 객체를 전달할 수도 있지만 나중 세션에서 업데이트를 처리할 것이므로 필요하지 않습니다.

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

USB나 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는 기기가 전원에 연결되거나 연결이 해제될 때마다 동작을 브로드캐스트합니다. 앱이 실행되지 않을 때도 이런 이벤트를 수신하는 것이 중요합니다. 특히, 이런 이벤트는 백그라운드 업데이트를 시작하기 위해 앱을 시작하는 횟수에 영향을 미칩니다. 그러므로 인텐트 필터에서 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>

연결된 BroadcastReceiver 구현에서는 이전 단계에서 설명하였듯이 현재 충전 상태와 메서드를 추출할 수 있습니다.

public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL;

        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
    }
}

현재 배터리 수준 확인

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

다음과 같이 배터리 상태 인텐트에서 현재 배터리 수준과 규모를 추출하여 현재 배터리 충전에 대해 알아봅니다.

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

float batteryPct = level / (float)scale;

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

배터리 상태를 쉽게 지속적으로 모니터링할 수는 없지만, 그렇게 해야 할 필요도 없습니다.

일반적으로 배터리 수준을 지속적으로 모니터링하는 작업이 앱의 평소 동작보다 배터리에 더 큰 영향을 미치므로 배터리 수준에 중요한 변화가 있을 때, 특히 기기가 낮은 배터리 상태에 들어가거나 여기서 종료될 때만 모니터링하는 것이 좋습니다.

아래 매니페스트 스니펫은 브로드캐스트 수신기 내의 인텐트 필터 요소에서 추출되었습니다. 수신기는 ACTION_BATTERY_LOWACTION_BATTERY_OKAY를 수신 대기하고 있다가 기기 배터리가 낮아지거나 저전력 상태에서 나갈 때마다 트리거됩니다.

<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
  <action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
  <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
  </intent-filter>
</receiver>

일반적으로는 배터리가 매우 낮을 때 모든 백그라운드 업데이트를 비활성화하는 것이 좋습니다. 사용하기도 전에 전화가 꺼져버린다면 아무리 최신 데이터도 소용 없습니다.

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

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

WeChat에서 Google Developers 팔로우하기

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)