您的位置:首页 > 移动开发 > Android开发

Android 电量变化监听

2017-09-14 11:23 337 查看
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.

Constant Value: "android.intent.action.BATTERY_CHANGED"

如果我们注册了对Intent.ACTION_BATTERY_CHANGED的监听,那么我们马上会收到一个Action为Intent.ACTION_BATTERY_CHANGED的intent,之后只要我们没有取消监听,一定电池发送变化,我们也会收到这样的intent。电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService通过广播
主动把数据传送给所关心的应用程序。

通过该intent的extra我们可以取得电池的很多信息,比如电压可以用如下的方式:voltage=intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);

BatteryManager类列出了该intent的extra所包含的信息:

String EXTRA_HEALTH :
integer.它表示当前电池的健康状态。

可能的值为:

int BATTERY_HEALTH_COLD

int BATTERY_HEALTH_DEAD

int BATTERY_HEALTH_GOOD

int BATTERY_HEALTH_OVERHEAT

int BATTERY_HEALTH_OVER_VOLTAGE

int BATTERY_HEALTH_UNKNOWN

int BATTERY_HEALTH_UNSPECIFIED_FAILURE

String EXTRA_ICON_SMALL :
integer.the resource ID of a small status bar icon indicating the current battery state.

它是当前用于表示电池状态的icon的资源id.

String EXTRA_LEVEL:
integer.它表示电池当前的电量, 它介于0和
EXTRA_SCALE之间
.

String EXTRA_PLUGGED :
integer.它表示当前手机使用的是哪里的电源。

可能的值有:

0:表示电源是电池

int BATTERY_PLUGGED_AC :表示电源是AC
charger.[应该是指充电器]。

int BATTERY_PLUGGED_USB :表示电源是USB
port.

String EXTRA_PRESENT:
boolean.表示是否提供电池。有些手机在使用USB电源的情况下,即使拔出了电池,仍然可以正常工作。

String EXTRA_SCALE:
integer.表示电池电量的最大值.

String EXTRA_STATUS :
integer。表示电池的当前状态。

可能的值为:

int BATTERY_STATUS_CHARGING 表示正在充电。

int BATTERY_STATUS_DISCHARGING

int BATTERY_STATUS_FULL 表示充满

int BATTERY_STATUS_NOT_CHARGING 表示没有充电

int BATTERY_STATUS_UNKNOWN表示未知状态。

String EXTRA_TECHNOLOGY :表示电池使用的技术。比如,对于锂电池是Li-ion.

String EXTRA_TEMPERATURE:integer
。表示当前电池的温度。

String EXTRA_VOLTAGE :
integer。表示当前电池的电压。.

另外还有两种intent专门用于表示电量低的情况

ACTION_BATTERY_LOW :表示当前电池电量低。

ACTION_BATTERY_OKAY:表示当前电池已经从电量低恢复为正常。

当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。

电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。

类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。

注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。


判断当前充电状态

通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。

因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
//你可以读到充电状态,如果在充电,可以读到是usb还是交流电

// 是否在充电
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;

// 怎么充
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;


通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。


监听充电状态的改变

充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。

充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action: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>


在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:
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;
}
}


判断当前剩余电量

在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。

你可以用下面的代码读到电量:
//当前剩余电量
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
//电量最大值
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
//电量百分比
float batteryPct = level / (float)scale;



监听剩余电量显著改变

持续监听电池状态不容易,但你不必这么做。

一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。

manifest里声明的接收器,会在进入或离开低电量状态时触发。
<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>


剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。

在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。

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.

Constant Value: "android.intent.action.BATTERY_CHANGED"

如果我们注册了对Intent.ACTION_BATTERY_CHANGED的监听,那么我们马上会收到一个Action为Intent.ACTION_BATTERY_CHANGED的intent,之后只要我们没有取消监听,一定电池发送变化,我们也会收到这样的intent。电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService通过广播
主动把数据传送给所关心的应用程序。

通过该intent的extra我们可以取得电池的很多信息,比如电压可以用如下的方式:voltage=intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);

BatteryManager类列出了该intent的extra所包含的信息:

String EXTRA_HEALTH :
integer.它表示当前电池的健康状态。

可能的值为:

int BATTERY_HEALTH_COLD

int BATTERY_HEALTH_DEAD

int BATTERY_HEALTH_GOOD

int BATTERY_HEALTH_OVERHEAT

int BATTERY_HEALTH_OVER_VOLTAGE

int BATTERY_HEALTH_UNKNOWN

int BATTERY_HEALTH_UNSPECIFIED_FAILURE

String EXTRA_ICON_SMALL :
integer.the resource ID of a small status bar icon indicating the current battery state.

它是当前用于表示电池状态的icon的资源id.

String EXTRA_LEVEL:
integer.它表示电池当前的电量, 它介于0和
EXTRA_SCALE之间
.

String EXTRA_PLUGGED :
integer.它表示当前手机使用的是哪里的电源。

可能的值有:

0:表示电源是电池

int BATTERY_PLUGGED_AC :表示电源是AC
charger.[应该是指充电器]。

int BATTERY_PLUGGED_USB :表示电源是USB
port.

String EXTRA_PRESENT:
boolean.表示是否提供电池。有些手机在使用USB电源的情况下,即使拔出了电池,仍然可以正常工作。

String EXTRA_SCALE:
integer.表示电池电量的最大值.

String EXTRA_STATUS :
integer。表示电池的当前状态。

可能的值为:

int BATTERY_STATUS_CHARGING 表示正在充电。

int BATTERY_STATUS_DISCHARGING

int BATTERY_STATUS_FULL 表示充满

int BATTERY_STATUS_NOT_CHARGING 表示没有充电

int BATTERY_STATUS_UNKNOWN表示未知状态。

String EXTRA_TECHNOLOGY :表示电池使用的技术。比如,对于锂电池是Li-ion.

String EXTRA_TEMPERATURE:integer
。表示当前电池的温度。

String EXTRA_VOLTAGE :
integer。表示当前电池的电压。.

另外还有两种intent专门用于表示电量低的情况

ACTION_BATTERY_LOW :表示当前电池电量低。

ACTION_BATTERY_OKAY:表示当前电池已经从电量低恢复为正常。

当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。

电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。

类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。

注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。


判断当前充电状态

通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。

因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
//你可以读到充电状态,如果在充电,可以读到是usb还是交流电

// 是否在充电
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;

// 怎么充
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;


通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。


监听充电状态的改变

充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。

充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action: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>


在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:
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;
}
}


判断当前剩余电量

在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。

你可以用下面的代码读到电量:
//当前剩余电量
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
//电量最大值
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
//电量百分比
float batteryPct = level / (float)scale;



监听剩余电量显著改变

持续监听电池状态不容易,但你不必这么做。

一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。

manifest里声明的接收器,会在进入或离开低电量状态时触发。
<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://www.android-doc.com/reference/android/os/BatteryManager.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息