監控電池電量和充電狀態

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

執行應用程式更新對電池續航力的影響取決於電池電量和 以及裝置的充電狀態在裝置透過交流電充電時執行更新的影響微乎其微,因此在大多數情況下,只要裝置連接到壁掛式充電器,就能將更新率提高到最高。反之,如果裝置正在放電,降低更新率有助於延長電池續航力。

同樣地,您也可以檢查電池電量,在電池電量幾乎耗盡時減少更新頻率,甚至停止更新。

判斷目前的充電狀態

首先,請確認目前的充電狀態。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 限制條件外),工作不應執行。

在許多情況下,充電動作會與將裝置放入基座的動作同時發生。詳情請參閱: 決定並 監控座架狀態和類型