zoukankan      html  css  js  c++  java
  • 转: Android 电源管理专题之监测电池电量和充电状态 | 润物无声

    通过检查设备当前的电池电量和充电状态,然后适当改变后台服务的更新频率,可以有效降低电量的消耗。所以您的应用程序的更新频率也应当根据设备当前的电池电量和充电状态来进行动态调整。

    通常情况下,当设备在充电的过程中,可以提高应用程序的数据更新频率,因为此时电池电量的消耗相较于充电的过程耗费很小,基本可以忽略。相反,如果电池是在正常的使用过程中,那么应当合理调整应用程序的更新频率,不能更新太频繁,这样有助于延长电池的使用寿命。

    同时,应用程序应当一直监视设备电量的状态变化,在设备电量不足时,尽量降低更新频率,或者干脆停止数据更新。

    获取当前的电池状态

    BatteryManager 会发送“sticky”类型的系统广播,在 Intent 中包括了当前的电池电量状态和充电状态等信息。

    因为电池状态的广播类型是 “sticky”类型的,所以我们不需要注册相应的BroadcastReceiver。只需要在调用 registerReceiver 的时候传递空参数null就可以,然后函数的返回值 intent 中就包括了当前电池状态的各种信息。

    当然您也可以传递一个自定义的 BroadcastReceiver ,在后面的章节里面有介绍,不过实际上也是没有什么必要的。

    示例代码:

    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = context.registerReceiver(null, ifilter);

    从返回的 Intent 中我们可以获得当前的充电状态和充电类型,是通过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 = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
    boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;

    通常情况下,在AC充电器的情况下,您可以最大化应用程序的更新频率,如果是在USB充电的状态下,适当降低更新频率,而如果是在非充电的时候,您应当将更新频率降到最低的情况,以合理利用电量。

    监听充电状态的变化

    作为便携式的插入充电设备,充电和非充电的状态切换有可能非常频繁,所以您的应用程序应该监测这种状态的切换,并随时调整应用程序的刷新频率。

    当设备与电源连接充电的时候,或者与充电电源断开的时候,系统的 BatteryManager 都会发送一个广播。

    您在应用程序中应当注册和监听这种系统广播,即使您的应用程序当前没有在运行,如果这些状态切换会影响您应用程序的后台服务的更新频率,您就应该注册 一个 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>

    BatteryManager 中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 == BATTERY_PLUGGED_USB;
         boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
       }
    }

    获得当前的电池电量等级

    很多时候需要获取当前的电量等级,当电池电量低于某一个级别的时候,您的应用程序应当降低后台服务的更新频率来尽量减小电量的消耗,您可以通过上文获取到的Intent来取得当前电量的Level和Scale,进而可以算出当前电量的百分比。

    示例代码:

    int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
    
    float batteryPct = level / (float)scale;

    监测电池电量的显着变化

    通常来说,我们没有必要一直持续的监听电池的状态变化,主要集中关注于电池电量在 “low battery state” 附近的变换即可,

    示例代码展示了监听电池电量在“low battery state” 状态的变化,分为为进入低电量状态和返回到电池电量正常的状态。
    对应的 Action分别为 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>

    比较好的解决方案是:当电池的电量非常低的时候,禁用所有程序的后台更新服务,如果手机因为电量不足自动关机,那么这个时候的最新数据也基本没有什么作用。

    通常当把Android设备放入一个Dock(设备底座)中就进入了充电状态,下一节课将介绍如何判断当前的dock状态和监听dock状态的改变。

    参考文摘:
    http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

     
     
     
    您可能喜欢:
     
    Android 电源管理专题之获取和监测网络连接状态
     
    探讨 Android 网络编程
     
    AIR for Android 之源码和实现原理分析
  • 相关阅读:
    洛谷 P2515 [HAOI2010]软件安装
    洛谷 P3818 小A和uim之大逃离 II
    洛谷 P3155 [CQOI2009]叶子的染色
    洛谷 P1414 又是毕业季II
    NOI 2014 起床困难综合征
    NOI 2001 反正切函数的应用
    CF1311E Construct the Binary Tree
    小技巧—卡格式
    CF817F MEX Queries
    洛谷 U138573 序章&第一章 黑暗时代(eviltime)
  • 原文地址:https://www.cnblogs.com/lovelili/p/2493567.html
Copyright © 2011-2022 走看看