通過檢查設(shè)備當(dāng)前的電池電量和充電狀態(tài),然后適當(dāng)改變后臺服務(wù)的更新頻率,可以有效降低電量的消耗。所以您的應(yīng)用程序的更新頻率也應(yīng)當(dāng)根據(jù)設(shè)備當(dāng)前的電池電量和充電狀態(tài)來進行動態(tài)調(diào)整。
通常情況下,當(dāng)設(shè)備在充電的過程中,可以提高應(yīng)用程序的數(shù)據(jù)更新頻率,因為此時電池電量的消耗相較于充電的過程耗費很小,基本可以忽略。相反,如果電池是在正常的使用過程中,那么應(yīng)當(dāng)合理調(diào)整應(yīng)用程序的更新頻率,不能更新太頻繁,這樣有助于延長電池的使用壽命。
同時,應(yīng)用程序應(yīng)當(dāng)一直監(jiān)視設(shè)備電量的狀態(tài)變化,在設(shè)備電量不足時,盡量降低更新頻率,或者干脆停止數(shù)據(jù)更新。
獲取當(dāng)前的電池狀態(tài)
BatteryManager 會發(fā)送“sticky”類型的系統(tǒng)廣播,在 Intent 中包括了當(dāng)前的電池電量狀態(tài)和充電狀態(tài)等信息。
因為電池狀態(tài)的廣播類型是 “sticky”類型的,所以我們不需要注冊相應(yīng)的BroadcastReceiver。只需要在調(diào)用 registerReceiver 的時候傳遞空參數(shù)null就可以,然后函數(shù)的返回值 intent 中就包括了當(dāng)前電池狀態(tài)的各種信息。
當(dāng)然您也可以傳遞一個自定義的 BroadcastReceiver ,在后面的章節(jié)里面有介紹,不過實際上也是沒有什么必要的。
示例代碼:
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
從返回的 Intent 中我們可以獲得當(dāng)前的充電狀態(tài)和充電類型,是通過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 = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
通常情況下,在AC充電器的情況下,您可以最大化應(yīng)用程序的更新頻率,如果是在USB充電的狀態(tài)下,適當(dāng)降低更新頻率,而如果是在非充電的時候,您應(yīng)當(dāng)將更新頻率降到最低的情況,以合理利用電量。
監(jiān)聽充電狀態(tài)的變化
作為便攜式的插入充電設(shè)備,充電和非充電的狀態(tài)切換有可能非常頻繁,所以您的應(yīng)用程序應(yīng)該監(jiān)測這種狀態(tài)的切換,并隨時調(diào)整應(yīng)用程序的刷新頻率。
當(dāng)設(shè)備與電源連接充電的時候,或者與充電電源斷開的時候,系統(tǒng)的 BatteryManager 都會發(fā)送一個廣播。
您在應(yīng)用程序中應(yīng)當(dāng)注冊和監(jiān)聽這種系統(tǒng)廣播,即使您的應(yīng)用程序當(dāng)前沒有在運行,如果這些狀態(tài)切換會影響您應(yīng)用程序的后臺服務(wù)的更新頻率,您就應(yīng)該注冊 一個 BroadcastReceiver 來監(jiān)聽這兩個事件,分別為 ACTION_POWER_CONNECTED 和 ACTION_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》
在 BatteryManager 中Receiver的實現(xiàn)代碼中,您可以獲得當(dāng)前電池的狀態(tài)信息,這在上文已經(jīng)提及。
示例代碼:
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;
}
}
獲得當(dāng)前的電池電量等級
很多時候需要獲取當(dāng)前的電量等級,當(dāng)電池電量低于某一個級別的時候,您的應(yīng)用程序應(yīng)當(dāng)降低后臺服務(wù)的更新頻率來盡量減小電量的消耗,您可以通過上文獲取到的Intent來取得當(dāng)前電量的Level和Scale,進而可以算出當(dāng)前電量的百分比。
示例代碼:
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;
監(jiān)測電池電量的顯著變化
通常來說,我們沒有必要一直持續(xù)的監(jiān)聽電池的狀態(tài)變化,主要集中關(guān)注于電池電量在 “l(fā)ow battery state” 附近的變換即可,
示例代碼展示了監(jiān)聽電池電量在“l(fā)ow battery state” 狀態(tài)的變化,分為為進入低電量狀態(tài)和返回到電池電量正常的狀態(tài)。
對應(yīng)的 Action分別為 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》
比較好的解決方案是:當(dāng)電池的電量非常低的時候,禁用所有程序的后臺更新服務(wù),如果手機因為電量不足自動關(guān)機,那么這個時候的最新數(shù)據(jù)也基本沒有什么作用。
通常當(dāng)把Android設(shè)備放入一個Dock(設(shè)備底座)中就進入了充電狀態(tài)。
評論