原文地址: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个固定的位置上的。下节课我们将会学习如何检查装备的放置环境和如何监测装备的放置状态。