變更背景更新頻率時 有關電池續航力更新、查看目前的電池電量和充電狀態,都是改善裝置的 。
執行應用程式更新對電池續航力的影響取決於電池電量和 以及裝置的充電狀態裝置透過 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_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
限制條件)。
在許多情況下,將裝置充電到座架上的行為並不容易。下一個 本課程將說明如何判斷目前的座架狀態,以及監控裝置變化 插入座架