1. 程式人生 > >Android監測電量和充電狀態

Android監測電量和充電狀態

Contents

監測電量和充電狀態... 1

確定當前充電狀態... 1

監測充電狀態變化... 1

確定當前電量水平... 2

監測電量的重要變化... 2

 

監測電量和充電狀態

當你調整後臺更新的頻率以降低頻繁更新導致電池老化的問題時,從檢查當前電量和充電狀態開始是個不錯的選擇。

應用更新對電池壽命的影響依賴於電池電量和充電狀態。當手機連線外接電源時,應用更新帶來的影響幾乎可以忽略不計,所以大多數情況下,當手機連線電源時,你可以將重新整理率提到最高。相反,如果手機沒充電時,降低重新整理率會延長電池壽命。

相似的,你可以檢查電池電量,可能的情況下降低更新頻率甚至在電量即將耗盡的時候關掉更新。

確定當前充電狀態

首先是確定當前的充電狀態。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>

最好在裝置進入低電量後關掉應用後臺更新。因為不管你的資料多新,如果手機沒電關機了,你也不能用。