广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    Android中检查、监听电量和充电状态的方法

    2018-04-09 07:41:37 次阅读 稿源:互联网
    广告

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

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

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

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

    判断当前充电状态

    通过判断当前充电状态开始。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;

    注:暂时不知道为什么要这样算,在我自己的机器上运行,scale就是100的。

    监听剩余电量显著改变

    持续监听电池状态不容易,但你不必这么做。
    一般来说,持续监听电池电量对电池的影响比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.jb51.net/article/51557.htm

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告