배터리 수준 및 충전 상태 모니터링
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
백그라운드 업데이트 빈도를 변경하여 업데이트의 영향을 줄이면
현재 배터리 수준 및 충전 상태를 확인하는 것이
시작합니다
애플리케이션 업데이트 수행으로 배터리 수명이 영향을 받는 정도는 기기의 배터리 수준과 충전 상태에 따라 달라집니다. 기기가 AC 전원으로 충전되는 동안 업데이트 수행의 영향
무시할 수 있는 정도이므로 대부분의 경우 기기가 연결되어 있을 때마다 화면 재생 빈도를 최대화할 수 있음
벽면 충전기에 연결할 수도 있습니다 반대로 기기가 방전되고 있으면 업데이트 비율을 낮추는 것이 배터리 수명을 늘리는 데 도움이 됩니다.
마찬가지로 배터리 충전 수준을 확인하여 배터리 충전 빈도를 줄일 수도 있습니다.
배터리 충전량이 거의 소진되었을 때 업데이트를 계속할 수 있습니다.
현재 충전 상태 확인
현재 충전 상태를 확인하는 작업부터 시작합니다. BatteryManager
고정 Intent
에 모든 배터리 및 충전 세부정보를 브로드캐스트합니다.
충전 상태를 확인할 수 있습니다.
고정 인텐트이므로 BroadcastReceiver
를 등록할 필요가 없습니다. 간단히 registerReceiver
를 호출하여
null
를 수신기로 사용하는 경우 현재 배터리 상태 인텐트는 다음과 같습니다.
반환합니다. 여기서 실제 BroadcastReceiver
객체를 전달할 수도 있지만
이후 섹션에서 업데이트를 처리할 것이므로 필요하지 않습니다.
Kotlin
val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->
context.registerReceiver(null, ifilter)
}
자바
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
자바
// 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
는 기기가 전원에 연결되거나 연결 해제될 때마다 작업을 브로드캐스트합니다. 앱이 호출되지 않을 때도 이러한 이벤트를 수신하는 것이 중요합니다.
특히 이러한 이벤트가 앱 실행 빈도에 영향을 주어야 하므로
백그라운드 업데이트를 시작합니다. 따라서 매니페스트에 BroadcastReceiver
를 등록하여 두 이벤트를 수신 대기하려면
인텐트 필터 내의 ACTION_POWER_CONNECTED
및 ACTION_POWER_DISCONNECTED
<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()
}
자바
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level * 100 / (float)scale;
배터리 수준의 큰 변화에 반응
배터리 상태를 지속적으로 모니터링하는 일은 어렵지만 그리할 필요가 없습니다.
일반적으로 배터리 수준을 모니터링하는 것은
배터리에 미치는 영향이 더 클 수 있습니다. 예를 들어 배터리가 부족할 때 대기 중인 작업을 취소하기 위해 매니페스트에 BroadcastReceiver
를 등록하면 주로 배터리가 더 소모되므로 Android 8.0부터는 불가능합니다. 대신 작업이 실행되어야 하는 시기를 설명하는 제약 조건을 제공하면 시스템이 앱을 시작하는 데 전력을 소비하지 않고도 결정을 내릴 수 있습니다.
일반적으로 배터리가 충전 중일 때는 백그라운드 업데이트를 실행하지 않는 것이 좋습니다.
매우 낮습니다. 스마트폰이 꺼져서 데이터를 사용할 수 없게 되면 데이터가 최신 상태라도 아무 소용이 없습니다. 이렇게 하려면
WorkManager 라이브러리 사용
다음으로
BatteryNotLow
제약조건
를 사용하여 배터리가 부족할 경우 작업을 실행하면 안 된다는 것을 지정합니다 (관련 작업 외에도
NetworkType
제약 조건).
많은 경우 기기를 충전하는 행동은 기기를 충전하는 것과
도킹할 수 있습니다. 자세한 내용은
결정 및
도킹 상태 및 유형 모니터링을 참조하세요.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Monitor the Battery Level and Charging State\n\nWhen you're altering the frequency of your background updates to reduce the effect of those\nupdates on battery life, checking the current battery level and charging state is a good place to\nstart.\n\nThe battery-life impact of performing application updates depends on the battery level and\ncharging state of the device. The impact of performing updates while the device is charging over AC\nis negligible, so in most cases you can maximize your refresh rate whenever the device is connected\nto a wall charger. Conversely, if the device is discharging, reducing your update rate helps\nprolong the battery life.\n\nSimilarly, you can check the battery charge level, potentially reducing the frequency of---or\neven stopping---your updates when the battery charge is nearly exhausted.\n\nDetermine the current charging state\n------------------------------------\n\nStart by determining the current charge status. The [BatteryManager](/reference/android/os/BatteryManager)\nbroadcasts all battery and charging details in a sticky [Intent](/reference/android/content/Intent) that includes\nthe charging status.\n\nBecause it's a sticky intent, you don't need to register a [BroadcastReceiver](/reference/android/content/BroadcastReceiver)---by simply calling `registerReceiver` passing in\n`null` as the receiver as shown in the next snippet, the current battery status intent is\nreturned. You could pass in an actual [BroadcastReceiver](/reference/android/content/BroadcastReceiver) object here, but\nwe'll be handling updates in a later section so it's not necessary. \n\n### Kotlin\n\n```kotlin\nval batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter -\u003e\n context.registerReceiver(null, ifilter)\n}\n```\n\n### Java\n\n```java\nIntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);\nIntent batteryStatus = context.registerReceiver(null, ifilter);\n```\n\nYou can extract both the current charging status and, if the device is being charged, whether\nit's charging via USB or AC charger:\n\n\n### Kotlin\n\n```kotlin\nval status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1\nval isCharging: Boolean = status == BatteryManager.BATTERY_STATUS_CHARGING\n || status == BatteryManager.BATTERY_STATUS_FULL\n\n// How are we charging?\nval chargePlug: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1\nval usbCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_USB\nval acCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_AC\n```\n\n### Java\n\n```java\n// Are we charging / charged?\nint status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);\nboolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||\n status == BatteryManager.BATTERY_STATUS_FULL;\n\n// How are we charging?\nint chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);\nboolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;\nboolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;\n```\n\nTypically you should maximize the rate of your background updates in the case where the device is\nconnected to an AC charger, reduce the rate if the charge is over USB, and lower it\nfurther if the battery is discharging.\n\nMonitor changes in charging state\n---------------------------------\n\nThe charging status can change as easily as a device can be plugged in, so it's important to\nmonitor the charging state for changes and alter your refresh rate accordingly.\n\nThe [BatteryManager](/reference/android/os/BatteryManager) broadcasts an action whenever the device is connected or\ndisconnected from power. It's important to receive these events even while your app isn't\nrunning---particularly as these events should impact how often you start your app in order to\ninitiate a background update---so you should register a [BroadcastReceiver](/reference/android/content/BroadcastReceiver) in your manifest to listen for both events by defining the\n[ACTION_POWER_CONNECTED](/reference/android/content/Intent#ACTION_POWER_CONNECTED) and [ACTION_POWER_DISCONNECTED](/reference/android/content/Intent#ACTION_POWER_DISCONNECTED) within an intent filter. \n\n```xml\n\u003creceiver android:name=\".PowerConnectionReceiver\"\u003e\n \u003cintent-filter\u003e\n \u003caction android:name=\"android.intent.action.ACTION_POWER_CONNECTED\"/\u003e\n \u003caction android:name=\"android.intent.action.ACTION_POWER_DISCONNECTED\"/\u003e\n \u003c/intent-filter\u003e\n\u003c/receiver\u003e\n```\n\nDetermine the current battery level\n-----------------------------------\n\nIn some cases it's also useful to determine the current battery level. You may choose to reduce\nthe rate of your background updates if the battery charge is below a certain level.\n\nYou can find the current battery charge by extracting the current battery level and scale from\nthe battery status intent as shown here: \n\n### Kotlin\n\n```kotlin\nval batteryPct: Float? = batteryStatus?.let { intent -\u003e\n val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)\n val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)\n level * 100 / scale.toFloat()\n}\n```\n\n### Java\n\n```java\nint level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);\nint scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);\n\nfloat batteryPct = level * 100 / (float)scale;\n```\n\nReact to significant changes in battery level\n---------------------------------------------\n\nYou can't easily continually monitor the battery state, but you don't need to.\n\nGenerally speaking, the impact of monitoring the battery level has a greater\nimpact on the battery than your app's normal behavior. For example, registering a\n`BroadcastReceiver` in the manifest to cancel pending work when the battery is low will\nmainly serve to drain the battery further (and is therefore\n[impossible since\nAndroid 8.0](/develop/background-work/background-tasks/broadcasts/broadcast-exceptions)). Instead, you can provide constraints on work that describe when it should be run,\nallowing the system to make the decision without spending power starting your app.\n\nIt is generally good practice to not run your background updates when the battery is\ncritically low. It doesn't matter how fresh your data is if the phone turns itself off before you\ncan make use of it. To do this,\n[use the WorkManager library](/develop/background-work/background-tasks/persistent/getting-started)\nwith a\n[`BatteryNotLow` constraint](/develop/background-work/background-tasks/persistent/getting-started/define-work#work-constraints)\nto specify that the work should not be run if the battery is low (in addition to any relevant\n`NetworkType` constraints).\n\nIn many cases, the act of charging a device is coincident with putting it\ninto a dock. To learn more, see\n[Determine and\nmonitor the docking state and type](/training/monitoring-device-state/docking-monitoring)."]]