Android监测电量和充电状态

Contents

监测电量和充电状态... 1

确定当前充电状态... 1

监测充电状态变化... 1

确定当前电量水平... 2

监测电量的重要变化... 2

 

监测电量和充电状态

当你调整后台更新的频率以降低频繁更新导致电池老化的问题时,从检查当前电量和充电状态开始是个不错的选择。

应用更新对电池寿命的影响依赖于电池电量和充电状态。当手机连接外接电源时,应用更新带来的影响几乎可以忽略不计,所以大多数情况下,当手机连接电源时,你可以将刷新率提到最高。相反,如果手机没充电时,降低刷新率会延长电池寿命。

相似的,你可以检查电池电量,可能的情况下降低更新频率甚至在电量即将耗尽的时候关掉更新。

确定当前充电状态

首先是确定当前的充电状态。BatteryManager广播通过一个sticky intent所有电池和充电细节,包括充电状态。

因为是sticky intent,所以不用注册BroadcastReceiver,像下面的代码段所示,只需要简单的调用registerReceiver,传入一个null作为接收者,当前电池状态的intent就可以返回。这里也可以传入一个实际的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充电时,降低频率,不充电时,降得更低。

监测充电状态变化

充电状态很容易改变,比如设备被插入插头,所以监测充电状态的变化并据此调整频率很重要。

设备连上电源和断开外接电源时,BatteryManager都会发出广播。就算你的应用并未运行,接收这个广播也很重要,因为这两个事件影响你应用启动并做后台更新的频率,所以你应该在manifest文件注册接收这两个事件通知的一个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实现中,就可以像上面方法一样得到当前的充电状态了。

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;

    }

}

确定当前电量水平

有些情况下,确定当前电量水平也很重要。你可以选择在电量低于某个值的时候降低应用更新的频率。

你可以从电池状态intent中提取当前电量和比例,如下所示:

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);

int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);



float batteryPct = level / (float)scale;

监测电量的重要变化

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

一般来说,持续监测电量变化对电池的影响会超过对你应用行为的影响。所以最好是指监测点亮的重要变化,比如电池电量进入或退出低电量状态。如下所示:

<receiver android:name=".BatteryLevelReceiver">

  <intent-filter>

    <action android:name="android.intent.action.BATTERY_LOW"/>

    <action android:name="android.intent.action.BATTERY_OKAY"/>

  </intent-filter>

</receiver>

最好在设备进入低电量后关掉应用后台更新。因为不管你的数据多新,如果手机没电关机了,你也不能用。

猜你喜欢

转载自blog.csdn.net/yubing1015/article/details/84822669