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

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

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

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

判断当前充电状态

通过判断当前充电状态开始。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 {@Overridepublic 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.pocketdigi.com/20140608/1341.html

Android开发:优化电池续航-监听电量和充电状态相关推荐

  1. Android开发心得-ListView的监听事件

    Android开发时,最常用的控件之一就是ListView了,而使用ListView的同时,必然需要对它设置监听器,常用的监听器有这么几个 1.OnItemClickListener  2.OnTou ...

  2. 独乐乐不如众乐乐,你的项目还在纠结用日志打印log么?Android开发okhttp3便捷拦截监听

    SimpleInterceptor SimpleInterceptor 是Android OkHttp客户端的的拦截接口工具,为的是方便测试或开发,快速查找问题. 环境要求 Android 4.1+ ...

  3. Android开发之使用BroadcastReceiver实时监听电量(源代码分享)

    Android系统中实时的监听手机电量以及开机启动功能都是通过BroadcastReceiver组件实现的.我们可以动态注册这个类的一个实例通过Context.registerReceiver()方法 ...

  4. Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态

    原文地址:http://android.xsoftlab.net/training/monitoring-device-state/index.html 引言 作为一款优秀的APP应用,应该总是想方设 ...

  5. Android 优化电池使用时间 ——监控电池电量和充电状态

    时常看Android官网开发文档,最近突然发现Android官网提供了一些中文翻译文档,真心感觉不错.考虑很大一部分童鞋都生活在大中华局域网里,不能畅游世界,特转载相关系列文档,以供大家一起学习,原文 ...

  6. android监测电池的电量与充电状态

    转 原文:http://developer.android.com/training/monitoring-device-state/battery-monitoring.html http://hu ...

  7. android充电状态广播,教学--监测电池的电量与充电状态

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 当你想通过改变后台更新操作的频率来减少对电池寿命的影响,那么首先需要检查当前电量与充电状态. 电池的电量与是否在充电状态会影响到一个程序去执行更新的操作. ...

  8. Android USB摄像头插拔监听

    Android USB摄像头插拔监听 一.简要介绍 二.使用广播监听USB摄像头插拔情况 1.注册监听USB设备插拔广播 2.判断UsbDevice是否是Camera设备 (重点) 二.通过UsbMa ...

  9. Android DownloadManager下载完成事件监听(系列4)

     Android DownloadManager下载完成事件监听(系列4) 我在之前写了写一些关于Android DownloadManager 的文章: (系列1)<Android大数据. ...

最新文章

  1. 计算机视觉——基本知识概念
  2. 好物推荐丨故宫出品“烧脑奇书”:豆瓣9.2分,悬疑解谜参与感强,11种结局,可以玩一年!...
  3. 女生学计算机类什么专业好就业前景,2019高考:适合女生报考的10大专业!就业前景好,待遇稳定!...
  4. matlab画线不同颜色_怎样画线框图才有意义
  5. 云游戏关键技术研究报告(2020年)
  6. opengl es 实现旋转的三角形
  7. 云原生2.0时代,华为云DevOps立体运维实践
  8. matlab向量相减代码,matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量等内容)...
  9. 第十至十二章 算法分析--高阶数据结构
  10. h.264保存flv文件
  11. springboot-28-security(一)用户角色控制
  12. JS常用事件兼容性处理方法
  13. Java选择排序(升序和降序)
  14. Eplan Electric P8 2.7安装流程
  15. python小游戏开题报告范文_课题开题报告范文
  16. vue 自定义指令 directive
  17. 单独的html怎么实现微信分享,html静态页面实现微信分享思路
  18. 最近学习太焦虑,如何戒骄戒躁,静下心来
  19. DHCP以及DHCP中继
  20. (九)打印机驱动设置—USB接口的设置

热门文章

  1. PythonBase(一)
  2. 视频监控如何实现异地共享/组网?EasyNTS解决远程难题
  3. 基于gnuradio的自适应陷波滤波器OOT模块(notch filter)
  4. 基于SSM框架的ERP生产管理系统源码 这是一个ERP生产管理系统
  5. mobilenet cpu 加速_使用NNAPI加速android-tflite的Mobilenet分类器
  6. 工科应该重视C/C++Qt的学习
  7. Java 中JAF、CORBA、JTA、JAXB、JAX-WS使用Maven的pom.xml文件配置
  8. 搭建docker镜像仓库
  9. G1D20-AnacondaCSKE综述AttacKG终于配好环境啦KG book CTF
  10. Windows中Java服务怎么打开防火墙