Android監測電量和充電狀態
Contents
監測電量和充電狀態
當你調整後臺更新的頻率以降低頻繁更新導致電池老化的問題時,從檢查當前電量和充電狀態開始是個不錯的選擇。
應用更新對電池壽命的影響依賴於電池電量和充電狀態。當手機連線外接電源時,應用更新帶來的影響幾乎可以忽略不計,所以大多數情況下,當手機連線電源時,你可以將重新整理率提到最高。相反,如果手機沒充電時,降低重新整理率會延長電池壽命。
相似的,你可以檢查電池電量,可能的情況下降低更新頻率甚至在電量即將耗盡的時候關掉更新。
確定當前充電狀態
首先是確定當前的充電狀態。BatteryManager廣播通過一個sticky intent所有電池和充電細節,包括充電狀態。
因為是sticky intent,所以不用註冊BroadcastReceiver,像下面的程式碼段所示,只需要簡單的呼叫registerReceiver,傳入一個null作為接收者,當前電池狀態的intent就可以返回。這裡也可以傳入一個實際的BroadcastReceiver物件,但是沒有必要,因為我們後面會有更新。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
既可以確定電源的充電狀態,也可以檢視充電裝置型別,比如USB或AC。
// 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都會發出廣播。就算你的應用並未執行,接收這個廣播也很重要,因為這兩個事件影響你應用啟動並做後臺更新的頻率,所以你應該在manifest檔案註冊接收這兩個事件通知的一個BroadcastReceiver。像下面一樣:
<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>
在這個BroadcastReceiver實現中,就可以像上面方法一樣得到當前的充電狀態了。
public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; } }
確定當前電量水平
有些情況下,確定當前電量水平也很重要。你可以選擇在電量低於某個值的時候降低應用更新的頻率。
你可以從電池狀態intent中提取當前電量和比例,如下所示:
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale;
監測電量的重要變化
持續監測電池狀態不容易,但你不必這麼做。
一般來說,持續監測電量變化對電池的影響會超過對你應用行為的影響。所以最好是指監測點亮的重要變化,比如電池電量進入或退出低電量狀態。如下所示:
<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>
最好在裝置進入低電量後關掉應用後臺更新。因為不管你的資料多新,如果手機沒電關機了,你也不能用。