1. 程式人生 > >Android 優化電池使用時間 ——監控電池電量和充電狀態

Android 優化電池使用時間 ——監控電池電量和充電狀態

時常看Android官網開發文件,最近突然發現Android官網提供了一些中文翻譯文件,真心感覺不錯。考慮很大一部分童鞋都生活在大中華局域網裡,不能暢遊世界,特轉載相關係列文件,以供大家一起學習,原文參見此處

監控電池電量和充電狀態

如果您要更改後臺更新頻率,從而減少更新對電池使用時間的影響,最好先檢視當前的電池電量和充電狀態。

對應用進行更新會影響電池使用時間,具體取決於裝置的電池電量和充電狀態。如果使用者正在通過交流電源為裝置充電,更新應用的影響就可以忽略不計。因此,在大多數情況下,只要裝置連線了充電器,您就可以最大程度地提高重新整理頻率。相反,如果裝置在消耗電池電量,那麼降低更新頻率就可以延長電池使用時間。

同樣,您也可以檢視電池電量,如果電量即將耗盡,您就可以降低更新頻率,甚至停止更新。

確定當前的充電狀態

請先確定當前的充電狀態。BatteryManager 會通過一個包含充電狀態的持續 Intent 廣播所有的電池詳情和充電詳情。由於這是個持續 intent,因此您無需通過將傳入 null 的 registerReceiver 作為接收器直接呼叫(如下一程式碼段所示)來註冊 BroadcastReceiver,系統會返回當前電池狀態 intent。您可以在此處傳入實際的 BroadcastReceiver 物件,不過我們會在下文中介紹如何處理更新,因此您不一定要執行此操作。

IntentFilter ifilter = new
IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter);

如果裝置正在充電,則您可以提取當前的充電狀態和充電方式(無論是通過 USB 還是交流充電器),如下所示:

// 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 = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;

通常,如果裝置連線了交流充電器,您就應最大程度地提高後臺更新頻率;如果裝置通過 USB 充電,請降低更新頻率;如果電池在耗電,請進一步降低更新頻率。

監控充電狀態的變化

充電狀態的改變就像裝置連線電源那樣容易,因此監控充電狀態的變化並相應地調整重新整理頻率就很重要了。只要裝置連線或斷開電源,BatteryManager 就會廣播相應的操作。即使您的應用沒有執行,也請務必接收這些事件,尤其是當這些事件會影響您啟動應用以執行後臺更新的頻率時。因此,您應該通過在 intent 過濾器中定義 ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED,在清單中註冊 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 == BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
    }
}

確定當前的電池電量

在某些情況下,確定當前的電池電量會對您有所幫助。如果電池電量低於一定水平,您可以降低後臺更新頻率。

您可以從電池狀態 intent 中提取要了解的當前電池電量以及電池容量,具體如下所示:

int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

監控電池電量的顯著變化

您無法輕鬆地對電池狀態進行持續監控,不過也無需這麼做。

一般來說,與應用的正常行為相比,持續監控電池電量會消耗更多電量。因此,比較合適的做法是隻監控電池電量的顯著變化(尤其是在裝置進入或結束低電量狀態的情況下)。

以下清單程式碼段提取自廣播接收器中的 intent 過濾器元素。通過偵聽 ACTION_BATTERY_LOW 和 ACTION_BATTERY_OKAY,只要裝置的電池進入或結束低電量狀態,系統就會觸發接收器。

<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
  <action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
  <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
  </intent-filter>
</receiver>

如果電池電量極低,通常比較合適的做法是停用所有後臺更新。如果您還沒用上更新的資料,手機就自動關機了,那這些資料再新也沒有意義。

在很多情況下,將裝置插入基座就可以為其充電。下一教程將向您介紹如何確定當前基座狀態及如何監控裝置對接的變化。