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

作者:junjie 时间:2023-05-15 23:23:19 

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

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

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

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

判断当前充电状态

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

剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。
在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。文章链接:https://www.jb51.net/article/51557.htm

标签:Android,电量,充电状态
0
投稿

猜你喜欢

  • Java StringBuilder和StringBuffer源码分析

    2023-04-03 00:10:58
  • SpringBoot使用Redisson实现分布式锁(秒杀系统)

    2022-07-17 05:15:41
  • MyBatis关闭一级缓存的两种方式(分注解和xml两种方式)

    2023-09-02 10:18:59
  • java判断各类型字符个数实例代码

    2022-01-22 16:39:15
  • C# Winform 实现控件自适应父容器大小的示例代码

    2021-06-15 20:00:52
  • 教你使用Java获取当前时间戳的详细代码

    2021-09-19 04:41:02
  • C#使用默认浏览器打开网页的方法

    2022-02-16 10:39:34
  • 浅谈java类和对象

    2021-10-01 06:01:59
  • JAVA泛型的继承和实现、擦除原理解析

    2023-03-12 19:37:09
  • 编写Java代码制造一个内存溢出的情况

    2022-11-13 07:58:12
  • java开发之闹钟的实现代码

    2021-07-08 12:46:49
  • Springboot JPA 枚举Enum类型存入到数据库的操作

    2023-11-25 16:11:40
  • java实现小i机器人api接口调用示例

    2023-02-05 00:09:15
  • java 判断两个对象是否为同一个对象实例代码

    2022-09-19 22:31:35
  • C#实现将浮点数表示的货币数量以汉字大写形式输出的方法

    2022-06-10 03:10:36
  • java 中 poi解析Excel文件版本问题解决办法

    2023-11-15 16:49:45
  • java使用Socket类接收和发送数据

    2021-05-26 15:28:47
  • Android 实现单线程轮循机制批量下载图片

    2022-11-05 11:03:45
  • Java中Spring Boot+Socket实现与html页面的长连接实例详解

    2022-12-24 12:06:12
  • Android学习之Broadcast的简单使用

    2023-11-19 15:18:02
  • asp之家 软件编程 m.aspxhome.com