• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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>&lt;receiver android:name=".PowerConnectionReceiver">
68  &lt;intent-filter>
69    &lt;action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
70    &lt;action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
71  &lt;/intent-filter>
72&lt;/receiver></pre>
73
74<p>다음의 {@link android.content.BroadcastReceiver} 구현에서 이전 단계에서 설명한 대로 현재 충전 상태와 방법을 알아낼 수 있습니다.</p>
75
76<pre>public class PowerConnectionReceiver extends BroadcastReceiver {
77    &#64;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>&lt;receiver android:name=".BatteryLevelReceiver">
111&lt;intent-filter>
112  &lt;action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
113  &lt;action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
114  &lt;/intent-filter>
115&lt;/receiver></pre>
116
117<p>배터리 충전 상태가 매우 낮은 경우 백그라운드 업데이트를 사용하지 않는 것이 좋습니다. 전화기가 꺼져버리면 최신 데이터를 제공하는 것이 의미가 없기 때문입니다.</p>
118
119<p>기기를 충전하는 것은 곧 기기를 도크에 집어넣는 것과 같은 경우가 많습니다. 다음 강의는 현재 도크 상태를 확인하고 기기 도킹의 변경사항을 모니터링하는 방법을 보여줍니다.</p>
120
121