原文链接:http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
作者:
完成时间:
如果您要更改后台更新频率,从而减少更新对电池使用时间的影响,最好先查看当前的电池电量和充电状态。
对应用进行更新会影响电池使用时间,具体取决于设备的电池电量和充电状态。如果用户正在通过交流电源为设备充电,更新应用的影响就可以忽略不计。因此,在大多数情况下,只要设备连接了充电器,您就可以最大程度地提高刷新频率。相反,如果设备在消耗电池电量,那么降低更新频率就可以延长电池使用时间。
同样,您也可以查看电池电量,如果电量即将耗尽,您就可以降低更新频率,甚至停止更新。
确定当前的充电状态
请先确定当前的充电状态。BatteryManager 会通过一个包含充电状态的持续 Intent 广播所有的电池详情和充电详情。
由于这是个持续 intent,因此您无需通过将传入 null 的 registerReceiver 作为接收器直接调用(如下一代码段所示)来注册 BroadcastReceiver,系统会返回当前电池状态 intent。您可以在此处传入实际的 BroadcastReceiver 对象,不过我们会在下文中介绍如何处理更新,因此您不一定要执行此操作。
|
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
|
如果设备正在充电,则您可以提取当前的充电状态和充电方式(无论是通过 USB 还是交流充电器),如下所示:
|
// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// How are we charging?
int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = BATTERY_PLUGGED_USB;
boolean acCharge = BATTERY_PLUGGED_AC;
|
通常,如果设备连接了交流充电器,您就应最大程度地提高后台更新频率;如果设备通过 USB 充电,请降低更新频率;如果电池在耗电,请进一步降低更新频率。
监控充电状态的变化
充电状态的改变就像设备连接电源那样容易,因此监控充电状态的变化并相应地调整刷新频率就很重要了。
只要设备连接或断开电源,BatteryManager 就会广播相应的操作。即使您的应用没有运行,也请务必接收这些事件,尤其是当这些事件会影响您启动应用以执行后台更新的频率时。因此,您应该通过在 intent 过滤器中定义 ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED,在清单中注册 BroadcastReceiver 来侦听这两个事件。
|
<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 时,您可以按上一步骤所述提取当前的充电状态和充电方式。
1
2
3
4
5
6
7
8
9
10
11
12
|
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = BATTERY_PLUGGED_USB;
boolean acCharge = BATTERY_PLUGGED_AC;
}
}
|
确定当前的电池量
在某些情况下,确定当前的电池电量会对您有所帮助。如果电池电量低于一定水平,您可以降低后台更新频率。
您可以从电池状态 intent 中提取要了解的当前电池电量以及电池容量,具体如下所示:
|
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;
|
监控电池电量的显著变化
您无法轻松地对电池状态进行持续监控,不过也无需这么做。
一般来说,与应用的正常行为相比,持续监控电池电量会消耗更多电量。因此,比较合适的做法是只监控电池电量的显著变化(尤其是在设备进入或结束低电量状态的情况下)。
以下清单代码段提取自广播接收器中的 intent 过滤器元素。通过侦听 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>
|
如果电池电量极低,通常比较合适的做法是停用所有后台更新。如果您还没用上更新的数据,手机就自动关机了,那这些数据再新也没有意义。
在很多情况下,将设备插入基座就可以为其充电。下一教程将向您介绍如何确定当前基座状态及如何监控设备对接的变化。
转自:http://wiki.eoe.cn/page/Monitoring_the_Battery_Level_and_Charging_State.html
==============================================================
当手机电量有变化,或者有充电情况的时候,android会自动的发送一个广播,要监视充电情况,只需截获这个广播就ok啦!
废话不想说的太多,查看了android的源代码才发现原来是这样实现的。
- /**
- * 先声明一个 IntentFilter 对象
- */
- private IntentFilter mIntentFilter;
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mIntentFilter = new IntentFilter();
- mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
- }
-
- protected void onResume()
- {
- super.onResume();
- // 注册消息处理器
- registerReceiver(mIntentReceiver, mIntentFilter);
- }
-
- //声明消息处理过程
- private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- //要看看是不是我们要处理的消息
- if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
- //电池电量,数字
- Log.d("Battery", "" + intent.getIntExtra("level", 0));
- //电池最大容量
- Log.d("Battery", "" + intent.getIntExtra("scale", 0));
- //电池伏数
- Log.d("Battery", "" + intent.getIntExtra("voltage", 0));
- //电池温度
- Log.d("Battery", "" + intent.getIntExtra("temperature", 0));
-
- //电池状态,返回是一个数字
- // BatteryManager.BATTERY_STATUS_CHARGING 表示是充电状态
- // BatteryManager.BATTERY_STATUS_DISCHARGING 放电中
- // BatteryManager.BATTERY_STATUS_NOT_CHARGING 未充电
- // BatteryManager.BATTERY_STATUS_FULL 电池满
- Log.d("Battery", "" + intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN));
-
- //充电类型 BatteryManager.BATTERY_PLUGGED_AC 表示是充电器,不是这个值,表示是 USB
- Log.d("Battery", "" + intent.getIntExtra("plugged", 0));
-
- //电池健康情况,返回也是一个数字
- //BatteryManager.BATTERY_HEALTH_GOOD 良好
- //BatteryManager.BATTERY_HEALTH_OVERHEAT 过热
- //BatteryManager.BATTERY_HEALTH_DEAD 没电
- //BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE 过电压
- //BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE 未知错误
- Log.d("Battery", "" + intent.getIntExtra("health",BatteryManager.BATTERY_HEALTH_UNKNOWN));
- }
- }
- };
在这里先只是看看手机充电情况的监视,其实手机电量的监视也只需要截获一个广播。很晚了,明天在捣鼓吧