文章目錄
- 擷取當前的電池狀態
- 監聽充電狀態的變化
- 獲得當前的電池電量等級
- 監測電池電量的顯著變化
通過檢查裝置當前的電池電量和充電狀態,然後適當改變後台服務的更新頻率,可以有效降低電量的消耗。所以您的應用程式的更新頻率也應當根據裝置當前的電池電量和充電狀態來進行動態調整。
通常情況下,當裝置在充電的過程中,可以提高應用程式的資料更新頻率,因為此時電池電量的消耗相較於充電的過程耗費很小,基本可以忽略。相反,如果電池是在正常的使用過程中,那麼應當合理調整應用程式的更新頻率,不能更新太頻繁,這樣有助於延長電池的使用壽命。
同時,應用程式應當一直監視裝置電量的狀態變化,在裝置電量不足時,盡量降低更新頻率,或者乾脆停止資料更新。
擷取當前的電池狀態
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(裝置底座)中就進入了充電狀態,下一節課將介紹如何判斷當前的dock狀態和監聽dock狀態的改變。
參考文摘:
http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
0
您可能喜歡:
Android 電源管理專題之擷取和監測網路連接狀態
探討 Android 網路編程
AIR for Android 之源碼和實現原理分析