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

バックグラウンド更新の頻度を変更して、それらの影響を軽減する場合 最新のバッテリーレベルと充電状態をチェックして、 開始します

アプリケーション アップデートの実行による電池寿命への影響は、電池残量と デバイスの充電状態を確認できます。デバイスを 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;

バッテリー残量の大幅な変化に対応する

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

一般的に、バッテリー レベルを監視することのバッテリーへの影響はアプリの通常の動作よりも大きいため、たとえば、マニフェストに BroadcastReceiver を登録して、バッテリー残量が少ないときに保留中の処理をキャンセルすると、バッテリーの消耗がさらに進むことになります(そのため、Android 8.0 以降では不可能です)。代わりに、処理の実行タイミングを記述する制約を処理に指定することで、アプリの起動に電力を消費することなく、システムが決定を下せるようにします。

一般的に、バッテリー残量が非常に低下しているときは、バックグラウンド アップデートを実行しないことをおすすめします。スマートフォンの電源がオフになる前に自動的に電源がオフになっていれば、データの更新頻度は関係ありません 活用できるようにします。そのためには、 WorkManager ライブラリを使用するBatteryNotLow の制約 (通常の関連イベントに加えて)バッテリー残量が少ない場合には、処理を実行しないよう指定します。 NetworkType 制約)。

多くの場合、デバイスを充電することは、 ホルダーにセットします。詳しくは、 特定し、 装着状態とタイプをモニタリングするをご覧ください。