電池残量と充電状態を監視する

バッテリー寿命への影響を抑えるためにバックグラウンド更新の頻度を変更する場合は、まず現在のバッテリー残量と充電状態を確認することから始めるとよいでしょう。

アプリのアップデートの実行によるバッテリー駆動時間への影響は、デバイスのバッテリー残量と充電状態によって異なります。デバイスが 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_CONNECTEDACTION_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;

バッテリー レベルの大きな変化を監視する

バッテリーの状態を継続的に監視することは簡単ではなく、また監視する必要もありません。

一般的に、バッテリー残量を常にモニタリングすると、アプリの通常の動作よりもバッテリーに大きな影響が及ぶため、特にデバイスのバッテリー残量が少ない状態になったときや、終了したときの、バッテリー レベルの大幅な変化のみをモニタリングすることをおすすめします。

以下のマニフェスト スニペットは、ブロードキャスト レシーバ内のインテント フィルタ要素から抽出されたものです。レシーバは、ACTION_BATTERY_LOWACTION_BATTERY_OKAY をリッスンすることにより、デバイスのバッテリー残量が少なくなるか、低下状態が解除されるとトリガーされます。

<receiver android:name=".BatteryLevelReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BATTERY_LOW"/>
    <action android:name="android.intent.action.BATTERY_OKAY"/>
  </intent-filter>
</receiver>

一般的に、電池が極端に低下したときは、バックグラウンド更新をすべて無効にすることをおすすめします。使用前にスマートフォンの電源がオフになっていれば、データの鮮度は関係ありません。

多くの場合、デバイスの充電動作はデバイスをホルダーに置くのと同時に行われます。次のレッスンでは、現在の装着状態を判断し、デバイスの装着の変化を監視する方法について説明します。