Android 監(jiān)測(cè)電池的電量與充電狀態(tài)

2018-08-02 18:26 更新

編寫:kesenhoo - 原文:http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

當(dāng)你想通過改變后臺(tái)更新操作的頻率來減少對(duì)電池壽命的影響時(shí),那么首先需要檢查當(dāng)前電量與充電狀態(tài)。

執(zhí)行應(yīng)用更新對(duì)電池壽命的影響是與電量和充電狀態(tài)密切相關(guān)的。當(dāng)使用交流電對(duì)設(shè)備充電時(shí),更新操作的影響可以忽略不計(jì),所以在大多數(shù)情況下,如果使用壁式充電器對(duì)設(shè)備進(jìn)行充電,我們可以將刷新頻率設(shè)置到最大。相反的,如果設(shè)備沒有在充電狀態(tài),那么我們就需要盡量減少設(shè)備的更新操作來延長(zhǎng)電池的續(xù)航能力。

同樣的,如果我們監(jiān)測(cè)到電量即將耗盡時(shí),那么應(yīng)該盡可能降低甚至停止更新操作。

判斷當(dāng)前充電狀態(tài)

首先來看一下應(yīng)該如何確定當(dāng)前的充電狀態(tài)。BatteryManager會(huì)廣播一個(gè)帶有電池與充電詳情的Sticky Intent

因?yàn)閺V播的是一個(gè)sticky Intent,所以不需要注冊(cè)BroadcastReceiver。僅僅只需要調(diào)用一個(gè)以null作為Receiver參數(shù)的registerReceiver()方法就可以了。如下面的代碼片段中展示的那樣,它返回了保存當(dāng)前電池信息的Intent。你也可以在這里傳入一個(gè)實(shí)際的BroadcastReceiver對(duì)象,但這并不是必須的。

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

我們可以提取出當(dāng)前的充電狀態(tài),以及設(shè)備處于充電時(shí),是通過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 = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

通常,我們可以在設(shè)備使用交流充電時(shí)最大化后臺(tái)更新頻率,在使用USB充電時(shí)降低更新頻率,在非充電狀態(tài)時(shí),將更新頻率進(jìn)一步降低。

監(jiān)測(cè)充電狀態(tài)的改變

充電狀態(tài)隨時(shí)可能改變,所以我們應(yīng)該檢查充電狀態(tài)的改變來調(diào)整更新頻率。

BatteryManager會(huì)在設(shè)備連接或者斷開充電器的時(shí)候廣播一個(gè)Action。即使應(yīng)用沒有運(yùn)行,我們也應(yīng)該接收這些事件的廣播,主要原因是因?yàn)檫@些事件會(huì)影響到應(yīng)用啟動(dòng)(從而進(jìn)行更新)的頻率,因此我們應(yīng)該在Manifest文件里面注冊(cè)一個(gè)BroadcastReceiver來監(jiān)聽含有ACTION_POWER_CONNECTED 與 ACTION_POWER_DISCONNECTED的Intent。

<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的實(shí)現(xiàn)中,提取出當(dāng)前的充電狀態(tài),如下所示:

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;
    }
}

判斷當(dāng)前電池電量

在一些情況下,獲取到當(dāng)前電池電量也很有幫助。我們可以在獲知電量少于某個(gè)級(jí)別的時(shí)候減少后臺(tái)的更新頻率。 我們可以通過電池狀態(tài)Intent獲取到電池電量與容量等信息,如下所示:

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

float batteryPct = level / (float)scale;

檢測(cè)電量的有效改變

我們不能不停地監(jiān)測(cè)電池狀態(tài),實(shí)際上這也是不必要的。通常來說,不間斷地監(jiān)測(cè)電量信息對(duì)電池的影響會(huì)遠(yuǎn)大于應(yīng)用本身對(duì)電池的影響。所以我們應(yīng)該僅監(jiān)測(cè)電量的一些顯著性變化,特別是當(dāng)設(shè)備進(jìn)入或者離開低電量狀態(tài)時(shí)。

在下面的Manifest文件片段中,BroadcastReceiver僅僅監(jiān)聽ACTION_BATTERY_LOWACTION_BATTERY_OKAY,這樣它就只會(huì)在設(shè)備電量進(jìn)入低電量或者離開低電量的時(shí)候被觸發(fā)。

<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>

通常我們都需要在進(jìn)入低電量的情況下,關(guān)閉所有后臺(tái)更新來維持設(shè)備的續(xù)航,因?yàn)檫@個(gè)時(shí)候做任何更新等操作都極有可能是無(wú)用的,因?yàn)橐苍S在你還沒來得及處理更新的數(shù)據(jù)時(shí),設(shè)備就因電量耗盡而自動(dòng)關(guān)機(jī)了。

在很多時(shí)候,用戶往往會(huì)將設(shè)備放入某種底座中充電(譯注:比如車載的底座式充電器),在下一節(jié)課程當(dāng)中,我們將會(huì)學(xué)習(xí)如何確定當(dāng)前的底座狀態(tài),以及如何監(jiān)聽設(shè)備底座的變化。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)