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

作者:

完成时间:

如果您要更改后台更新频率,从而减少更新对电池使用时间的影响,最好先查看当前的电池电量和充电状态。

对应用进行更新会影响电池使用时间,具体取决于设备的电池电量和充电状态。如果用户正在通过交流电源为设备充电,更新应用的影响就可以忽略不计。因此,在大多数情况下,只要设备连接了充电器,您就可以最大程度地提高刷新频率。相反,如果设备在消耗电池电量,那么降低更新频率就可以延长电池使用时间。

同样,您也可以查看电池电量,如果电量即将耗尽,您就可以降低更新频率,甚至停止更新。

确定当前的充电状态


请先确定当前的充电状态。BatteryManager 会通过一个包含充电状态的持续 Intent 广播所有的电池详情和充电详情。

由于这是个持续 intent,因此您无需通过将传入 null 的 registerReceiver 作为接收器直接调用(如下一代码段所示)来注册 BroadcastReceiver,系统会返回当前电池状态 intent。您可以在此处传入实际的 BroadcastReceiver 对象,不过我们会在下文中介绍如何处理更新,因此您不一定要执行此操作。

1
2

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

如果设备正在充电,则您可以提取当前的充电状态和充电方式(无论是通过 USB 还是交流充电器),如下所示:

1
2
3
4
5
6
7
8
9

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = BatteryManager.BATTERY_STATUS_CHARGING ||status == BatteryManager.BATTERY_STATUS_FULL;// How are we charging?
int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = BATTERY_PLUGGED_USB;
boolean acCharge = BATTERY_PLUGGED_AC;

通常,如果设备连接了交流充电器,您就应最大程度地提高后台更新频率;如果设备通过 USB 充电,请降低更新频率;如果电池在耗电,请进一步降低更新频率。

监控充电状态的变化


充电状态的改变就像设备连接电源那样容易,因此监控充电状态的变化并相应地调整刷新频率就很重要了。

只要设备连接或断开电源,BatteryManager 就会广播相应的操作。即使您的应用没有运行,也请务必接收这些事件,尤其是当这些事件会影响您启动应用以执行后台更新的频率时。因此,您应该通过在 intent 过滤器中定义 ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED,在清单中注册 BroadcastReceiver 来侦听这两个事件。

1
2
3
4
5
6

<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 时,您可以按上一步骤所述提取当前的充电状态和充电方式。

 123456789
10
11
12

public class PowerConnectionReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);boolean isCharging = BatteryManager.BATTERY_STATUS_CHARGING ||status == BatteryManager.BATTERY_STATUS_FULL;int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);boolean usbCharge = BATTERY_PLUGGED_USB;boolean acCharge = BATTERY_PLUGGED_AC;}
}

确定当前的电池量


在某些情况下,确定当前的电池电量会对您有所帮助。如果电池电量低于一定水平,您可以降低后台更新频率。

您可以从电池状态 intent 中提取要了解的当前电池电量以及电池容量,具体如下所示:

1
2
3
4

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

监控电池电量的显著变化


您无法轻松地对电池状态进行持续监控,不过也无需这么做。

一般来说,与应用的正常行为相比,持续监控电池电量会消耗更多电量。因此,比较合适的做法是只监控电池电量的显著变化(尤其是在设备进入或结束低电量状态的情况下)。

以下清单代码段提取自广播接收器中的 intent 过滤器元素。通过侦听 ACTION_BATTERY_LOW 和 ACTION_BATTERY_OKAY,只要设备的电池进入或结束低
电量状态,系统就会触发接收器。

1
2
3
4
5
6

<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://wiki.eoe.cn/page/Monitoring_the_Battery_Level_and_Charging_State.html

==============================================================

当手机电量有变化,或者有充电情况的时候,android会自动的发送一个广播,要监视充电情况,只需截获这个广播就ok啦!
废话不想说的太多,查看了android的源代码才发现原来是这样实现的。

  1. /**
  2. * 先声明一个 IntentFilter 对象
  3. */
  4. private IntentFilter   mIntentFilter;
  5. public void onCreate(Bundle savedInstanceState)
  6. {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. mIntentFilter = new IntentFilter();
  10. mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
  11. }
  12. protected void onResume()
  13. {
  14. super.onResume();
  15. // 注册消息处理器
  16. registerReceiver(mIntentReceiver, mIntentFilter);
  17. }
  18. //声明消息处理过程
  19. private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
  20. @Override
  21. public void onReceive(Context context, Intent intent) {
  22. String action = intent.getAction();
  23. //要看看是不是我们要处理的消息
  24. if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
  25. //电池电量,数字
  26. Log.d("Battery", "" + intent.getIntExtra("level", 0));
  27. //电池最大容量
  28. Log.d("Battery", "" + intent.getIntExtra("scale", 0));
  29. //电池伏数
  30. Log.d("Battery", "" + intent.getIntExtra("voltage", 0));
  31. //电池温度
  32. Log.d("Battery", "" + intent.getIntExtra("temperature", 0));
  33. //电池状态,返回是一个数字
  34. // BatteryManager.BATTERY_STATUS_CHARGING 表示是充电状态
  35. // BatteryManager.BATTERY_STATUS_DISCHARGING 放电中
  36. // BatteryManager.BATTERY_STATUS_NOT_CHARGING 未充电
  37. // BatteryManager.BATTERY_STATUS_FULL 电池满
  38. Log.d("Battery", "" + intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN));
  39. //充电类型 BatteryManager.BATTERY_PLUGGED_AC 表示是充电器,不是这个值,表示是 USB
  40. Log.d("Battery", "" + intent.getIntExtra("plugged", 0));
  41. //电池健康情况,返回也是一个数字
  42. //BatteryManager.BATTERY_HEALTH_GOOD 良好
  43. //BatteryManager.BATTERY_HEALTH_OVERHEAT 过热
  44. //BatteryManager.BATTERY_HEALTH_DEAD 没电
  45. //BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE 过电压
  46. //BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE 未知错误
  47. Log.d("Battery", "" + intent.getIntExtra("health",BatteryManager.BATTERY_HEALTH_UNKNOWN));
  48. }
  49. }
  50. };

在这里先只是看看手机充电情况的监视,其实手机电量的监视也只需要截获一个广播。很晚了,明天在捣鼓吧

android电池电量监控相关推荐

  1. android电池电量监控,android电量监控 Battery Widget Reborn

    android电量监控 Battery Widget Reborn Pro 你一款管理安卓手机电池的使用软件,其中包括对电池的基本使用信息.使用寿命.电容等方面对电池进行分析管理,提高电池的使用率,安 ...

  2. Android 电池电量监控初步

    整体思路概览 ①由于要显示电池图标,因此需要一组对应的小icon,程序算出当前电量之后,就在状态栏上显示对应的icon即可.本程序用到的icon已经提供在附件,下载后将里面的icons直接复制到res ...

  3. android 电池电量广播,Android查看电池电量的方法(基于BroadcastReceiver)

    本文实例讲述了Android查看电池电量的方法.分享给大家供大家参考,具体如下: 程序如下: import android.app.Activity; import android.app.Dialo ...

  4. android电池电量更新,android 电池(三):android电池系统

    一.电池系统结构 Android中的电池使用方式主要有三种:AC.USB.Battery 等不同的模式.在应用程序层次,通常包括了电池状态显示的功能.因此从 Android 系统的软件方面(包括驱动程 ...

  5. Android设备电量监控

    这次介绍的是如何通过广播监听设备 这个很简单不用太多介绍,直接看代码 01 /** 02  * 电量监控 03  * 04  * <a href="http://home.51cto. ...

  6. android 检测电量变化,Android电池电量检测

    电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的.电池的这些信息是BatteryService通过广播 主动把数据传送给所关心的应用程序. 应用如果想要接收到Batte ...

  7. android 电池电量显示不正常,vivo电量显示不正常怎么解决?vivo手机电量校准教程...

    vivo手机用了一段时间会发现,手机电量显示会出现不准确的情况,明明刚充满电不到10分钟,仅剩50%电量:或者充电一晚上,电量仍然显示为70%,无法充满.小伙伴们稍安勿躁,这并不是电池本身出了问题,而 ...

  8. Android电池电量检测

    电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的.电池的这些信息是BatteryService通过广播 主动把数据传送给所关心的应用程序. 应用如果想要接收到Batte ...

  9. Android电池电量更新 - BatteryService(转)

    电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的.BatteryService是跑在system_process当中,在系统初始化的时候启动,如下 在SystemSer ...

最新文章

  1. linux信号量参数能在线改吧,UCOSII信号量有问题,CNT值会自己变化
  2. 回流Reflow和重绘Repaint
  3. python3 zip函数
  4. ARP解决方法/工具+真假ARP防范区别方法+ARP终极解决方案
  5. git rebase之前需要 commit 才行
  6. android 获取高德地图坐标,获取地址描述数据-获取地图数据-开发指南-Android 地图SDK | 高德地图API...
  7. 计算机网络(2.12)物理层- 宽带接入技术-FTTx技术
  8. 【百度一键分享功能】百度一键分享插件
  9. 被谢耳朵一直嘲笑的MIT,这次发明了黑镜中的“恐怖机器”
  10. 【FPGA】DS18B20数字温度传感器实验
  11. FineReport报表设计基础
  12. pdf分割拆分——speedpdf帮您免费在线将PDF拆分成多个文件
  13. 创建XTP图表的方法
  14. 腾讯又一长达 8 年的服务下架。。。
  15. apple watch更新系统时出现红色感叹号怎么办?
  16. 【集创赛】arm杯一等奖作品:智能BLDC驱动系统
  17. JavaScript 中字符串截取 (+实现)
  18. MES系统中常见的数据采集方法
  19. 怎么上传ftp服务器文件,ftp服务器如何上传本地文件
  20. 正则匹配过滤空格字符串

热门文章

  1. 三年级优秀书籍推荐_(完整)小学三年级课外阅读书目推荐
  2. WebRTC Opus编码器的创建与参数细节分析( sdp -> native )
  3. oracle检查约束的创建,检查约束调用函数Oracle SQL开发人员
  4. 学习HTML和CSS的扩展部分
  5. SRE service
  6. 多媒体教室计算机加投影机和电动幕配置方案
  7. 下载了免费的txt电子书,如何用Windows电脑阅读?
  8. vmware 16 安装 macOS15
  9. 纵行科技携手意法半导体推ZETA/LoRa双模智能路由,加速LPWAN 2.0泛在物联布局!
  10. C#实战028:OleDb操作-Excel数据写入