原文地址:http://android.xsoftlab.net/training/monitoring-device-state/index.html
作為1款優秀的APP利用,應當總是千方百計的下降電量的消耗。通過這節課的學習,你將有能力使APP可以基于裝備的狀態來調劑APP的功能及行動。
我們可以通過比如在斷開連接時關閉后臺服務,或在電量低的時候下降更新的頻率等等手段來下降電量的消耗。
在更改后臺的更新頻次時,檢查當前的電池電量及充電狀態是我們先要做的。
利用程序的更新頻率取決于電池的電量和充電狀態。由于裝備處于充電狀態時利用的耗電量幾近可以疏忽,所以,在裝備連接到充電器時,你可以將利用的刷新頻率開到最大,如果裝備沒有在充電,那末下降更新頻率可以延長電池的使命時間。
首先我們需要檢查當前的充電狀態。BatteryManager會將電池信息和充電信息通過粘性Intent將其廣播。
由于是粘性Intent,所以不需要注冊BroadcastReceiver,只需要在調用registerReceiver()時傳1個null就能夠,當前的電池狀態由該方法直接返回。你也能夠在這里傳遞1個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狀態,這個頻率應當適當下降,如果斷開充電,則應當進1步下降。
裝備的充電狀態很容易隨著充電器的插入、拔出而產生變化。所以隨著充電狀態的變化應當相應的調劑利用的刷新頻率。
當裝備插上充電器或是拔出充電器時,BatteryManager都會廣播1個Action,所以應當注冊1個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 {
@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 == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
}
}
在1些情況下還需要檢查裝備的剩余電量。當電量較低時可能需要下降利用的后臺服務頻率。
你可以通過以下方式取得裝備的剩余電量:
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;
利用不能1直連續不斷的監聽電池的狀態。
通常來講,1直不斷的監聽電池電量會使監聽電池的任務大于利用的實際任務,所以最好是只監聽1些比較重要的變更事件。
下面的清單文件摘自1段廣播接收器內。該廣播接收器會在電池的電量很低時或是在電量恢復到安全水平時被觸發。它監聽了兩個事件: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之前,手機關機了,那末利用的數據是不是是最新的就沒那末重要了。
在很多情況下,手機充電時是被放在1個固定的位置上的。下節課我們將會學習如何檢查裝備的放置環境和如何監測裝備的放置狀態。