1page.title=배터리 수준 및 충전 상태 모니터링 2parent.title=배터리 수명 최적화 3parent.link=index.html 4 5trainingnavtop=true 6next.title=도킹 상태와 유형 확인 및 모니터링 7next.link=docking-monitoring.html 8 9@jd:body 10 11<div id="tb-wrapper"> 12<div id="tb"> 13 14<h2>강의 목표</h2> 15<ol> 16 <li><a href="#DetermineChargeState">현재 충전 상태 확인</a></li> 17 <li><a href="#MonitorChargeState">충전 상태 변경사항 모니터링</a></li> 18 <li><a href="#CurrentLevel">현재 배터리 수준 확인</a></li> 19 <li><a href="#MonitorLevel">배터리 수준 중요 변경사항 모니터링</a></li> 20</ol> 21 22<h2>참고자료</h2> 23<ul> 24 <li><a href="{@docRoot}guide/components/intents-filters.html">인텐트 및 인텐트 필터</a> 25</ul> 26 27</div> 28</div> 29 30<p>백그라운드 업데이트가 배터리 수명에 미치는 영향을 줄이기 위하여 백그라운드 업데이트 빈도수를 변경하는 경우, 현재 배터리 수준과 충전 상태부터 확인하는 것이 좋습니다.</p> 31 32<p>애플리케이션 업데이트 수행이 배터리 수명에 미치는 영향은 배터리 수준 및 기기의 충전 상태에 따라 다릅니다. 기기를 AC 충전기로 충전하는 동안 업데이트 수행이 미치는 영향은 무시해도 좋습니다. 따라서 기기가 범용 충전기에 연결되어 있을 때는 대부분 새로고침 빈도를 최대화할 수 있습니다. 반대로 기기가 충전 중이 아니라면, 업데이트 빈도를 줄이는 것이 배터리 수명 연장에 도움이 됩니다.</p> 33 34<p>마찬가지로 배터리가 거의 방전된 경우, 업데이트 빈도를 줄이거나 중단할 수 있습니다.</p> 35 36 37<h2 id="DetermineChargeState">현재 충전 상태 확인</h2> 38 39<p>먼저 현재 충전 상태를 확인하는 것부터 시작합니다. {@link android.os.BatteryManager}는 배터리 충전 상태 등 충전 정보를 스티키 {@link android.content.Intent}를 통해 브로드캐스트합니다.</p> 40 41<p>스티키 인텐트이므로 {@link android.content.BroadcastReceiver}를 등록할 필요가 없으며 아래 코드 상의 리시버와 같이 간단히 {@code registerReceiver}을(를) 호출하여 {@code null}에 제출하면 현재 배터리 상태가 담긴 인텐트가 반환됩니다. 여기에 실제 {@link android.content.BroadcastReceiver} 개체 사용할 수 있으나, 이후 섹션에서 업데이트를 다루게 되므로 그럴 필요는 없습니다.</p> 42 43<pre>IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 44Intent batteryStatus = context.registerReceiver(null, ifilter);</pre> 45 46<p>현재 충전 상태와 어떤 충전기(USB 또는 AC 전원)로 충전하는지 추출할 수 있습니다.<p> 47 48<pre>// Are we charging / charged? 49int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 50boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || 51 status == BatteryManager.BATTERY_STATUS_FULL; 52 53// How are we charging? 54int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 55boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; 56boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;</pre> 57 58<p>일반적으로 기기가 AC 충전기에 연결된 경우 백그라운드 업데이트 빈도를 최대화합니다. USB를 통해 충전하는 경우 업데이트 빈도를 낮춥니다. 배터리가 방전 중이라면 빈도를 더 많이 낮추도록 합니다.</p> 59 60 61<h2 id="MonitorChargeState">충전 상태 변경사항 모니터링</h2> 62 63<p>충전 상태는 수시로 변하므로 충전 상태의 변경사항을 확인하고 이에 따라 업데이트 주기를 변경하는 것이 중요합니다.</p> 64 65<p>{@link android.os.BatteryManager}는 기기가 전원에 연결되어 있는지 여부와 관계없이 언제나 액션을 브로드캐스트합니다. 앱이 실행되지 않는 동안에도 이벤트를 수신하는 것이 중요합니다. 특히 백그라운드 업데이트를 실행하기 위해 앱을 시작하는 빈도수에 이벤트가 영향을 주기 때문입니다. 따라서 두 이벤트를 수신하려면 매니페스트에서 {@link android.content.BroadcastReceiver}를 등록하여 인텐트 필터 내에 {@link android.content.Intent#ACTION_POWER_CONNECTED}와 {@link android.content.Intent#ACTION_POWER_DISCONNECTED}를 정의해야 합니다.</p> 66 67<pre><receiver android:name=".PowerConnectionReceiver"> 68 <intent-filter> 69 <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> 70 <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> 71 </intent-filter> 72</receiver></pre> 73 74<p>다음의 {@link android.content.BroadcastReceiver} 구현에서 이전 단계에서 설명한 대로 현재 충전 상태와 방법을 알아낼 수 있습니다.</p> 75 76<pre>public class PowerConnectionReceiver extends BroadcastReceiver { 77 @Override 78 public void onReceive(Context context, Intent intent) { 79 int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 80 boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || 81 status == BatteryManager.BATTERY_STATUS_FULL; 82 83 int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 84 boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; 85 boolean acCharge = chargePlug == BATTERY_PLUGGED_AC; 86 } 87}</pre> 88 89 90<h2 id="CurrentLevel">현재 배터리 수준 확인</h2> 91 92<p>현재 배터리 수준을 확인하는 것이 유용한 경우도 있습니다. 배터리 충전이 수준 이하인 경우 백그라운드 업데이트 빈도를 줄일 수 있습니다.</p> 93 94<p>다음은 배터리 상태 정보가 담긴 인텐트에서 현재 배터리 수준 및 충전 상태를 추출하는 방법입니다.</p> 95 96<pre>int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 97int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 98 99float batteryPct = level / (float)scale;</pre> 100 101 102<h2 id="MonitorLevel">배터리 수준 중요 변경사항 모니터링</h2> 103 104<p>배터리 상태를 지속적으로 확인하는 것은 쉽지 않지만, 꼭 그럴 필요도 없습니다.</p> 105 106<p>배터리 수준을 지속적으로 모니터링하는 것은 앱의 다른 작업보다 배터리에 더 큰 영향을 미칩니다. 따라서 기기가 배터리 전원 부족 상태가 되거나 이를 벗어날 때 등 중요한 변경사항만 확인하는 것이 좋습니다.</p> 107 108<p>다음 코드는 매니페스트의 브로드캐스트 리시버 내의 인텐트 필터를 보여줍니다. 배터리가 얼마 남지 않거나{@link android.content.Intent#ACTION_BATTERY_LOW} 배터리 상태가 회복되었을 때{@link android.content.Intent#ACTION_BATTERY_OKAY} 전달되는 메시지를 수신할 수 있습니다.</p> 109 110<pre><receiver android:name=".BatteryLevelReceiver"> 111<intent-filter> 112 <action android:name="android.intent.action.ACTION_BATTERY_LOW"/> 113 <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/> 114 </intent-filter> 115</receiver></pre> 116 117<p>배터리 충전 상태가 매우 낮은 경우 백그라운드 업데이트를 사용하지 않는 것이 좋습니다. 전화기가 꺼져버리면 최신 데이터를 제공하는 것이 의미가 없기 때문입니다.</p> 118 119<p>기기를 충전하는 것은 곧 기기를 도크에 집어넣는 것과 같은 경우가 많습니다. 다음 강의는 현재 도크 상태를 확인하고 기기 도킹의 변경사항을 모니터링하는 방법을 보여줍니다.</p> 120 121