文档:http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
Intent.ACTION_BATTERY_CHANGED
This is a sticky broadcast containing the charging state, level, and other information about the battery. See BatteryManager
for documentation on the contents of the Intent.
你不能像组件那样在manifests里声明一个receive ,你只能通过Context.registerReceiver()注册。. See ACTION_BATTERY_LOW
,ACTION_BATTERY_OKAY
, ACTION_POWER_CONNECTED
, and ACTION_POWER_DISCONNECTED
for distinct battery-related broadcasts that are sent and can be received through manifest receivers.
This is a protected intent that can only be sent by the system.
EXTRA_SCALE之间
.
当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。
电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。
类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。
注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。
通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。
因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。
通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。
充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。
充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action:ACTION_POWER_CONNECTED 和ACTION_POWER_DISCONNECTED作为过滤。
在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:
在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。
你可以用下面的代码读到电量:
持续监听电池状态不容易,但你不必这么做。
一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。
manifest里声明的接收器,会在进入或离开低电量状态时触发。
剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。
在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。
int status = intent.getIntExtra("status", 0); //电池状态,充电、放电、充满、未充电
int health = intent.getIntExtra("health", 0); //电池的健康状态
boolean present = intent.getBooleanExtra("present", false);
int level = intent.getIntExtra("level", 0); //获取当前电量
int scale = intent.getIntExtra("scale", 0); //获取总电量
int icon_small = intent.getIntExtra("icon-small", 0);
int plugged = intent.getIntExtra("plugged", 0);
int voltage = intent.getIntExtra("voltage", 0); // 电池伏数
int temperature = intent.getIntExtra("temperature", 0); // 电池温度
String technology = intent.getStringExtra("technology");
//电池状态
switch (intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN)) {
{
case BatteryManager.BATTERY_STATUS_CHARGING:
BatteryStatus = "充电状态";
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
BatteryStatus = "放电状态";
break;
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
BatteryStatus = "未充电";
break;
case BatteryManager.BATTERY_STATUS_FULL:
BatteryStatus = "充满电";
break;
case BatteryManager.BATTERY_STATUS_UNKNOWN:
BatteryStatus = "未知道状态";
break;
}
switch (intent.getIntExtra("plugged", BatteryManager.BATTERY_PLUGGED_AC))
{
case BatteryManager.BATTERY_PLUGGED_AC:
BatteryStatus2 = "AC充电";
break;
case BatteryManager.BATTERY_PLUGGED_USB:
BatteryStatus2 = "USB充电";
break;
}
switch (intent.getIntExtra("health",
BatteryManager.BATTERY_HEALTH_UNKNOWN))
{
case BatteryManager.BATTERY_HEALTH_UNKNOWN:
BatteryTemp = "未知错误";
break;
case BatteryManager.BATTERY_HEALTH_GOOD:
BatteryTemp = "状态良好";
break;
case BatteryManager.BATTERY_HEALTH_DEAD:
BatteryTemp = "电池没有电";
break;
case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
BatteryTemp = "电池电压过高";
break;
case BatteryManager.BATTERY_HEALTH_OVERHEAT:
BatteryTemp = "电池过热";
break;
}
简单例子
stat_sys_battery_charge.xml
-
-
-
-
-
private class BatteryInfoBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
int status = intent.getIntExtra("status", 0);
int level = intent.getIntExtra("level", 0);
switch (status) {
case BatteryManager.BATTERY_STATUS_UNKNOWN:
play_iv_battery.setImageResource(R.drawable.stat_sys_battery_unknown);
break;
case BatteryManager.BATTERY_STATUS_CHARGING:
Toast.makeText(MainActivity.this, "正在充电", 300).show();
play_iv_battery.setImageResource(R.drawable.stat_sys_battery_charge);
play_iv_battery.getDrawable().setLevel(level);
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
play_iv_battery.setImageResource(R.drawable.stat_sys_battery);
play_iv_battery.getDrawable().setLevel(level);
Toast.makeText(MainActivity.this, "正在放电", 300).show();
break;
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
break;
case BatteryManager.BATTERY_STATUS_FULL:
play_iv_battery.setImageResource(R.drawable.stat_sys_battery_100);
break;
}
}
}
IntentFilter mIntentFilter = new IntentFilter();mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
batteryInfo = new BatteryInfoBroadcastReceiver();
registerReceiver(batteryInfo, mIntentFilter);
参考:http://developer.android.com/training/monitoring-device-state/battery-monitoring.html