blob: 2eacccf64106d67ac830dc9b34661c377e29e90e [file] [log] [blame]
page.title=배터리 수준 충전 상태 모니터링
parent.title=배터리 수명 최적화
parent.link=index.html
trainingnavtop=true
next.title=도킹 상태와 유형 확인 모니터링
next.link=docking-monitoring.html
@jd:body
<div id="tb-wrapper">
<div id="tb">
<h2>강의 목표</h2>
<ol>
<li><a href="#DetermineChargeState">현재 충전 상태 확인</a></li>
<li><a href="#MonitorChargeState">충전 상태 변경사항 모니터링</a></li>
<li><a href="#CurrentLevel">현재 배터리 수준 확인</a></li>
<li><a href="#MonitorLevel">배터리 수준 중요 변경사항 모니터링</a></li>
</ol>
<h2>참고자료</h2>
<ul>
<li><a href="{@docRoot}guide/components/intents-filters.html">인텐트 인텐트 필터</a>
</ul>
</div>
</div>
<p>백그라운드 업데이트가 배터리 수명에 미치는 영향을 줄이기 위하여 백그라운드 업데이트 빈도수를 변경하는 경우, 현재 배터리 수준과 충전 상태부터 확인하는 것이 좋습니다.</p>
<p>애플리케이션 업데이트 수행이 배터리 수명에 미치는 영향은 배터리 수준 기기의 충전 상태에 따라 다릅니다. 기기를 AC 충전기로 충전하는 동안 업데이트 수행이 미치는 영향은 무시해도 좋습니다. 따라서 기기가 범용 충전기에 연결되어 있을 때는 대부분 새로고침 빈도를 최대화할 있습니다. 반대로 기기가 충전 중이 아니라면, 업데이트 빈도를 줄이는 것이 배터리 수명 연장에 도움이 됩니다.</p>
<p>마찬가지로 배터리가 거의 방전된 경우, 업데이트 빈도를 줄이거나 중단할 있습니다.</p>
<h2 id="DetermineChargeState">현재 충전 상태 확인</h2>
<p>먼저 현재 충전 상태를 확인하는 것부터 시작합니다. {@link android.os.BatteryManager}는 배터리 충전 상태 충전 정보를 스티키 {@link android.content.Intent}를 통해 브로드캐스트합니다.</p>
<p>스티키 인텐트이므로 {@link android.content.BroadcastReceiver}를 등록할 필요가 없으며 아래 코드 상의 리시버와 같이 간단히 {@code registerReceiver}을(를) 호출하여 {@code null}에 제출하면 현재 배터리 상태가 담긴 인텐트가 반환됩니다. 여기에 실제 {@link android.content.BroadcastReceiver} 개체 사용할 있으나, 이후 섹션에서 업데이트를 다루게 되므로 그럴 필요는 없습니다.</p>
<pre>IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);</pre>
<p>현재 충전 상태와 어떤 충전기(USB 또는 AC 전원)로 충전하는지 추출할 있습니다.<p>
<pre>// 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 = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;</pre>
<p>일반적으로 기기가 AC 충전기에 연결된 경우 백그라운드 업데이트 빈도를 최대화합니다. USB 통해 충전하는 경우 업데이트 빈도를 낮춥니다. 배터리가 방전 중이라면 빈도를 많이 낮추도록 합니다.</p>
<h2 id="MonitorChargeState">충전 상태 변경사항 모니터링</h2>
<p>충전 상태는 수시로 변하므로 충전 상태의 변경사항을 확인하고 이에 따라 업데이트 주기를 변경하는 것이 중요합니다.</p>
<p>{@link android.os.BatteryManager}는 기기가 전원에 연결되어 있는지 여부와 관계없이 언제나 액션을 브로드캐스트합니다. 앱이 실행되지 않는 동안에도 이벤트를 수신하는 것이 중요합니다. 특히 백그라운드 업데이트를 실행하기 위해 앱을 시작하는 빈도수에 이벤트가 영향을 주기 때문입니다. 따라서 이벤트를 수신하려면 매니페스트에서 {@link android.content.BroadcastReceiver}를 등록하여 인텐트 필터 내에 {@link android.content.Intent#ACTION_POWER_CONNECTED}와 {@link android.content.Intent#ACTION_POWER_DISCONNECTED}를 정의해야 합니다.</p>
<pre>&lt;receiver android:name=".PowerConnectionReceiver">
&lt;intent-filter>
&lt;action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
&lt;action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
&lt;/intent-filter>
&lt;/receiver></pre>
<p>다음의 {@link android.content.BroadcastReceiver} 구현에서 이전 단계에서 설명한 대로 현재 충전 상태와 방법을 알아낼 있습니다.</p>
<pre>public class PowerConnectionReceiver extends BroadcastReceiver {
&#64;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 == BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
}
}</pre>
<h2 id="CurrentLevel">현재 배터리 수준 확인</h2>
<p>현재 배터리 수준을 확인하는 것이 유용한 경우도 있습니다. 배터리 충전이 수준 이하인 경우 백그라운드 업데이트 빈도를 줄일 있습니다.</p>
<p>다음은 배터리 상태 정보가 담긴 인텐트에서 현재 배터리 수준 충전 상태를 추출하는 방법입니다.</p>
<pre>int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;</pre>
<h2 id="MonitorLevel">배터리 수준 중요 변경사항 모니터링</h2>
<p>배터리 상태를 지속적으로 확인하는 것은 쉽지 않지만, 그럴 필요도 없습니다.</p>
<p>배터리 수준을 지속적으로 모니터링하는 것은 앱의 다른 작업보다 배터리에 영향을 미칩니다. 따라서 기기가 배터리 전원 부족 상태가 되거나 이를 벗어날 중요한 변경사항만 확인하는 것이 좋습니다.</p>
<p>다음 코드는 매니페스트의 브로드캐스트 리시버 내의 인텐트 필터를 보여줍니다. 배터리가 얼마 남지 않거나{@link android.content.Intent#ACTION_BATTERY_LOW} 배터리 상태가 회복되었을 때{@link android.content.Intent#ACTION_BATTERY_OKAY} 전달되는 메시지를 수신할 수 있습니다.</p>
<pre>&lt;receiver android:name=".BatteryLevelReceiver">
&lt;intent-filter>
&lt;action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
&lt;action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
&lt;/intent-filter>
&lt;/receiver></pre>
<p>배터리 충전 상태가 매우 낮은 경우 백그라운드 업데이트를 사용하지 않는 것이 좋습니다. 전화기가 꺼져버리면 최신 데이터를 제공하는 것이 의미가 없기 때문입니다.</p>
<p>기기를 충전하는 것은 기기를 도크에 집어넣는 것과 같은 경우가 많습니다. 다음 강의는 현재 도크 상태를 확인하고 기기 도킹의 변경사항을 모니터링하는 방법을 보여줍니다.</p>