監控電池電量和充電狀態

當您為了減少這些更新對電池續航力的影響而修改背景更新的頻率時,不妨先查看目前的電池電量和充電狀態。

執行應用程式更新對電池壽命的影響取決於裝置的電池電量和充電狀態。當裝置透過 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>

一般來說,當電池電量極低時,最好停用所有背景更新。無論資料有多長,只要手機在您使用前自行關機,都不會有太大更新。

在多數情況下,將裝置充電時,其實是將裝置插入座架。下一個課程將說明如何判斷目前的座架狀態,並監控裝置文件中的異動情形。