監控電池電量和充電狀態

變更背景更新頻率時 有關電池續航力更新、查看目前的電池電量和充電狀態,都是改善裝置的 。

執行應用程式更新對電池續航力的影響取決於電池電量和 以及裝置的充電狀態裝置透過 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 充電,請降低速率,然後降低到 AC 充電器。 電池在放電時可再重設

監控充電狀態的變化

充電狀態可能會隨著裝置接上電源而改變,因此請務必 監控充電狀態變化,並據此調整重新整理頻率。

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 限制條件)。

在許多情況下,將裝置充電到座架上的行為並不容易。下一個 本課程將說明如何判斷目前的座架狀態,以及監控裝置變化 插入座架