編輯:關於android開發
通過檢查設備當前的電池電量和充電狀態,然後適當改變後台服務的更新頻率,可以有效降低電量的消耗。所以您的應用程序的更新頻率也應當根據設備當前的電池電量和充電狀態來進行動態調整。
通常情況下,當設備在充電的過程中,可以提高應用程序的數據更新頻率,因為此時電池電量的消耗相較於充電的過程耗費很小,基本可以忽略。相反,如果電池是在正常的使用過程中,那麼應當合理調整應用程序的更新頻率,不能更新太頻繁,這樣有助於延長電池的使用壽命。
同時,應用程序應當一直監視設備電量的狀態變化,在設備電量不足時,盡量降低更新頻率,或者干脆停止數據更新。
r 會發送“sticky”類型的系統廣播,在 Intent 中包括了當前的電池電量狀態和充電狀態等信息。
因為電池狀態的廣播類型是 “sticky”類型的,所以我們不需要注冊相應的BroadcastReceiver。只需要在調用 的時候傳遞空參數null就可以,然後函數的返回值 intent 中就包括了當前電池狀態的各種信息。
當然您也可以傳遞一個自定義的 ,在後面的章節裡面有介紹,不過實際上也是沒有什麼必要的。
示例代碼:
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充電的狀態下,適當降低更新頻率,而如果是在非充電的時候,您應當將更新頻率降到最低的情況,以合理利用電量。
作為便攜式的插入充電設備,充電和非充電的狀態切換有可能非常頻繁,所以您的應用程序應該監測這種狀態的切換,並隨時調整應用程序的刷新頻率。
當設備與電源連接充電的時候,或者與充電電源斷開的時候,系統的 都會發送一個廣播。
您在應用程序中應當注冊和監聽這種系統廣播,即使您的應用程序當前沒有在運行,如果這些狀態切換會影響您應用程序的後台服務的更新頻率,您就應該注冊 一個 來監聽這兩個事件,分別為 和
示例代碼:
<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>
在 中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分別為 和 .
<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://blog.zhourunsheng.com/2011/12/android-%e7%94%b5%e6%ba%90%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e7%9b%91%e6%b5%8b%e7%94%b5%e6%b1%a0%e7%94%b5%e9%87%8f%e5%92%8c%e5%85%85%e7%94%b5%e7%8a%b6%e6%80%81/ | 潤物無聲
Android開發重點難點1:RelativeLayout(相對布局)詳解, 前言 啦啦啦~博主又推出了一個新的系列啦~ 之前的Android開發系列
安卓第四天筆記-Sqlite,安卓第四天-sqlite安卓第四天筆記-Sqlite 1.數據庫的創建運行與更新 1.1.創建一個類繼承SqliteOpenHelper &
android:exported 屬性分析 昨天在用360掃描應用漏洞時,掃描結果,出來一個android:exported屬性,其實之
Android捕獲崩潰異常,Android捕獲崩潰開發中最讓人頭疼的是應用突然爆炸,然後跳回到桌面。而且我們常常不知道這種狀況會何時出現,在應用調試階段還好,還可以通過調