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