Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态
原文地址:http://android.xsoftlab.net/training/monitoring-device-state/index.html
引言
作為一款優秀的APP應用,應該總是想方設法的降低電量的消耗。通過這節課的學習,你將有能力使APP可以基于設備的狀態來調整APP的功能及行為。
我們可以通過比如在斷開連接時關閉后臺服務,或者在電量低的時候降低更新的頻率等等手段來降低電量的消耗。
監測電池電量及充電狀態
在更改后臺的更新頻次時,檢查當前的電池電量及充電狀態是我們先要做的。
應用程序的更新頻率取決于電池的電量以及充電狀態。由于設備處于充電狀態時應用的耗電量幾乎可以忽略,所以,在設備連接到充電器時,你可以將應用的刷新頻率開到最大,如果設備沒有在充電,那么降低更新頻率可以延長電池的使命時間。
檢查當前的充電狀態
首先我們需要檢查當前的充電狀態。BatteryManager會將電池信息以及充電信息通過粘性Intent將其廣播。
因為是粘性Intent,所以不需要注冊BroadcastReceiver,只需要在調用registerReceiver()時傳一個null就可以,當前的電池狀態由該方法直接返回。你也可以在這里傳遞一個BroadcastReceiver對象,但是我們接下來的處理方式并不是在其中做的,所以這并不是必須的。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter);如果設備當前處于充電狀態,那么可以獲得當前的充電狀態,無論它是通過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 = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;通常的做法是:應當是在連接到AC電源適配器時,將后臺的更新頻率加到最大,如果當前處于USB狀態,這個頻率應當適當降低,如果斷開充電,則應當進一步降低。
監測充電狀態的變化
設備的充電狀態很容易隨著充電器的插入、拔出而發生變化。所以隨著充電狀態的變化應當相應的調整應用的刷新頻率。
當設備插上充電器或是拔出充電器時,BatteryManager都會廣播一個Action,所以應當注冊一個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>在該BroadcastReceiver內,你可以獲取當前的充電狀態:
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 == BatteryManager.BATTERY_PLUGGED_USB;boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;} }檢查電池的剩余電量
在一些情況下還需要檢查設備的剩余電量。當電量較低時可能需要降低應用的后臺服務頻率。
你可以通過以下方式獲得設備的剩余電量:
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale;監測電量的重要變化
應用不能一直連續不斷的監聽電池的狀態。
通常來說,一直不斷的監聽電池電量會使監聽電池的任務大于應用的實際任務,所以最好是只監聽一些比較重要的變更事件。
下面的清單文件摘自一段廣播接收器內。該廣播接收器會在電池的電量很低時或者是在電量恢復到安全水平時被觸發。它監聽了兩個事件: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>通常情況下,在電量很低時要關閉所有的后臺更新。加載在使用APP之前,手機關機了,那么應用的數據是否是最新的就沒那么重要了。
在很多情況下,手機充電時是被放在一個固定的位置上的。下節課我們將會學習如何檢查設備的放置環境以及如何監測設備的放置狀態。
總結
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐系统经典论文学习
- 下一篇: 随笔-机器如何学习我们的知识?