Android 优化电池使用时间 ——监控电池电量和充电状态
時(shí)常看Android官網(wǎng)開發(fā)文檔,最近突然發(fā)現(xiàn)Android官網(wǎng)提供了一些中文翻譯文檔,真心感覺不錯(cuò)。考慮很大一部分童鞋都生活在大中華局域網(wǎng)里,不能暢游世界,特轉(zhuǎn)載相關(guān)系列文檔,以供大家一起學(xué)習(xí),原文參見此處。
監(jiān)控電池電量和充電狀態(tài)
如果您要更改后臺更新頻率,從而減少更新對電池使用時(shí)間的影響,最好先查看當(dāng)前的電池電量和充電狀態(tài)。
對應(yīng)用進(jìn)行更新會影響電池使用時(shí)間,具體取決于設(shè)備的電池電量和充電狀態(tài)。如果用戶正在通過交流電源為設(shè)備充電,更新應(yīng)用的影響就可以忽略不計(jì)。因此,在大多數(shù)情況下,只要設(shè)備連接了充電器,您就可以最大程度地提高刷新頻率。相反,如果設(shè)備在消耗電池電量,那么降低更新頻率就可以延長電池使用時(shí)間。
同樣,您也可以查看電池電量,如果電量即將耗盡,您就可以降低更新頻率,甚至停止更新。
確定當(dāng)前的充電狀態(tài)
請先確定當(dāng)前的充電狀態(tài)。BatteryManager 會通過一個(gè)包含充電狀態(tài)的持續(xù) Intent 廣播所有的電池詳情和充電詳情。由于這是個(gè)持續(xù) intent,因此您無需通過將傳入 null 的 registerReceiver 作為接收器直接調(diào)用(如下一代碼段所示)來注冊 BroadcastReceiver,系統(tǒng)會返回當(dāng)前電池狀態(tài) intent。您可以在此處傳入實(shí)際的 BroadcastReceiver 對象,不過我們會在下文中介紹如何處理更新,因此您不一定要執(zhí)行此操作。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter);如果設(shè)備正在充電,則您可以提取當(dāng)前的充電狀態(tài)和充電方式(無論是通過 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 = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;通常,如果設(shè)備連接了交流充電器,您就應(yīng)最大程度地提高后臺更新頻率;如果設(shè)備通過 USB 充電,請降低更新頻率;如果電池在耗電,請進(jìn)一步降低更新頻率。
監(jiān)控充電狀態(tài)的變化
充電狀態(tài)的改變就像設(shè)備連接電源那樣容易,因此監(jiān)控充電狀態(tài)的變化并相應(yīng)地調(diào)整刷新頻率就很重要了。只要設(shè)備連接或斷開電源,BatteryManager 就會廣播相應(yīng)的操作。即使您的應(yīng)用沒有運(yùn)行,也請務(wù)必接收這些事件,尤其是當(dāng)這些事件會影響您啟動應(yīng)用以執(zhí)行后臺更新的頻率時(shí)。因此,您應(yīng)該通過在 intent 過濾器中定義 ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED,在清單中注冊 BroadcastReceiver 來偵聽這兩個(gè)事件。
<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>在實(shí)施相關(guān)的 BroadcastReceiver 時(shí),您可以按上一步驟所述提取當(dāng)前的充電狀態(tài)和充電方式
public class PowerConnectionReceiver extends BroadcastReceiver {@Overridepublic 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)前的電池電量會對您有所幫助。如果電池電量低于一定水平,您可以降低后臺更新頻率。
您可以從電池狀態(tài) intent 中提取要了解的當(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)控電池電量的顯著變化
您無法輕松地對電池狀態(tài)進(jìn)行持續(xù)監(jiān)控,不過也無需這么做。
一般來說,與應(yīng)用的正常行為相比,持續(xù)監(jiān)控電池電量會消耗更多電量。因此,比較合適的做法是只監(jiān)控電池電量的顯著變化(尤其是在設(shè)備進(jìn)入或結(jié)束低電量狀態(tài)的情況下)。
以下清單代碼段提取自廣播接收器中的 intent 過濾器元素。通過偵聽 ACTION_BATTERY_LOW 和 ACTION_BATTERY_OKAY,只要設(shè)備的電池進(jìn)入或結(jié)束低電量狀態(tài),系統(tǒng)就會觸發(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>如果電池電量極低,通常比較合適的做法是停用所有后臺更新。如果您還沒用上更新的數(shù)據(jù),手機(jī)就自動關(guān)機(jī)了,那這些數(shù)據(jù)再新也沒有意義。
在很多情況下,將設(shè)備插入基座就可以為其充電。下一教程將向您介紹如何確定當(dāng)前基座狀態(tài)及如何監(jiān)控設(shè)備對接的變化。
總結(jié)
以上是生活随笔為你收集整理的Android 优化电池使用时间 ——监控电池电量和充电状态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的引用类型(附图说明)
- 下一篇: Android 优化电池使用时间——确定