電池残量と充電状態を監視する
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
バックグラウンド更新の頻度を変更して、それらの影響を軽減する場合
最新のバッテリーレベルと充電状態をチェックして、
開始します
アプリケーション アップデートの実行による電池寿命への影響は、電池残量と
デバイスの充電状態を確認できます。デバイスを AC で充電しているときにアップデートを実行した場合の影響
リフレッシュ レートはごくわずかなので、ほとんどの場合、デバイスが接続されているときはリフレッシュ レートを最大にすることができます。
コンセントに接続してください。逆に、デバイスが電池を使用しているときは、アップデート レートを下げるとバッテリー寿命を延ばすのに役立ちます。
同様に、バッテリーの充電レベルもチェックできるので、バッテリーの充電頻度や
バッテリーの残量が残りわずかになると、更新が行われます。
現在の充電状態を特定する
初めに現在の充電状態を特定します。BatteryManager
によってすべての電池と充電の詳細がスティッキー Intent
でブロードキャストされますが、これには充電ステータスが含まれています。
これはスティッキー インテントであるため、BroadcastReceiver
を登録する必要はありません。次のスニペットに示すように、registerReceiver
を呼び出して null
をレシーバとして渡すだけで、現在のバッテリー ステータス インテントが返されます。ここで実際の BroadcastReceiver
オブジェクトを渡すこともできますが、アップデートは後述のセクションで処理するため必要ありません。
Kotlin
val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->
context.registerReceiver(null, ifilter)
}
Java
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
Java
// 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()
}
Java
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
制約)。
多くの場合、デバイスを充電することは、
ホルダーにセットします。詳しくは、
特定し、
装着状態とタイプをモニタリングするをご覧ください。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は 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)."]]