文章目录

  • 一、获取充电状态
  • 二、被动获取充电状态
  • 三、主动获取充电状态

参考 Google 官方文档 : 优化电池续航时间

一、获取充电状态


在应用中执行某些操作 , 如软件云端备份 , 从服务器端获取最新版本号 , 从服务器端缓存最新软件安装包 , 固件版本 , 等操作 , 最好都在充电状态 , 那么如何获取充电状态呢 , 这里给出两个方式 , 分别是主动获取充电状态 , 被动获取充电状态 ;

二、被动获取充电状态


1 . 被动获取充电状态 :

① 监听方法 : 注册广播接受者 , 监听充电状态变化 ;

② 场景描述 : 当用户插拔数据线时 , 充电状态发生变化时 , 系统发出对应的广播 , 使用广播接受者接收这些广播 ;

③ 数据线插入广播 : 当数据线插入时 , 系统会发出 Intent.ACTION_POWER_CONNECTED 广播 ;

④ 数据线拔出广播 : 当数据线拔出时 , 系统会发出 Intent.ACTION_POWER_DISCONNECTED 广播 ;

2 . 广播接受者代码示例 :

package kim.hsl.bp;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;/*** 被动获取充电状态* 充电状态发生变化时 , 系统发出的广播 , 使用广播接受者接收这些广播*/
public class BatteryReceiver extends BroadcastReceiver {public static final String TAG = "BatteryReceiver";@Overridepublic void onReceive(Context context, Intent intent) {// 获取广播事件String action = intent.getAction();if(TextUtils.equals(Intent.ACTION_POWER_CONNECTED, action)){// 数据线插入Log.i(TAG, "数据线插入");}else if(TextUtils.equals(Intent.ACTION_POWER_DISCONNECTED, action)){// 数据先拔出Log.i(TAG, "数据线拔出");}}
}

3 . AndroidManifest.xml 注册广播接受者代码示例 :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.bp"><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiver android:name=".BatteryReceiver" ><intent-filter><!-- 充电线插上 --><action android:name="android.intent.action.ACTION_POWER_CONNECTED" /><!-- 充电线拔出 --><action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /></intent-filter></receiver></application></manifest>

三、主动获取充电状态


1 . 主动获取充电状态流程 :

① 创建 IntentFilter : 创建 IntentFilter , 并为其设置 Intent.ACTION_BATTERY_CHANGED 意图 ;

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

② 注册广播接受者 : 调用 Context 对象的 registerReceiver 方法 , 设置 BroadcastReceiver receiver 广播接收者参数为空 , IntentFilter 就是上述创建的意图过滤器 ;

Intent intent = context.registerReceiver(null, intentFilter);

③ 获取充电状态 : 从注册广播返回的 Intent 意图中获取对应的充电状态 ;

int batteryChargeState = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);

④ 对比充电状态 : 将上述从 Intent.ACTION_BATTERY_CHANGED 匹配的意图中获取 BatteryManager.EXTRA_PLUGGED 对应的值 , 与以下 333 个值进行对比 , 如果一致 , 说明当前是此种充电状态 ;

  • BatteryManager.BATTERY_PLUGGED_AC : 交流电充电 ;
  • BatteryManager.BATTERY_PLUGGED_USB : USB 接口充电 ;
  • BatteryManager.BATTERY_PLUGGED_WIRELESS : 无线充电 ;

2 . 广播接受者注册用法 :

① 注册广播接收者 : registerReceiver 方法主要作用是在主线程注册一个广播接收者 BroadcastReceiver 运行 ;

② 广播接收者调用 : 当注册的 IntentFilter 中的 action 匹配到相应的广播时 , BroadcastReceiver 会被在主线程调用 ;

③ 历史广播保存 : 系统发送完毕的广播 , 会被保存下来 , 在后续注册时发送 ;

④ 广播复用机制 : 一旦有广播接收者注册广播 , 如果之前发送完毕的广播与本次注册的 IntentFilter 意图的 Action 匹配 , 次函数就会返回一个 Intent , 这个 Intent 就是之前已经发送的广播 ;

⑤ 如 : 本次注册的 IntentFilter 中包含 Intent.ACTION_BATTERY_CHANGED , 如果使用如下方法 context.registerReceiver(null, intentFilter) 注册空广播接收者 , 返回值就是之前发送过的 Intent.ACTION_BATTERY_CHANGED 广播 , 可以从该广播中获取对应的充电状态变化数据 ;

⑥ 注册多个意图 : 如果在 IntentFilter 中注册多个意图 , 广播接收者如果不为空 , 则会处理每一个意图 , 但是返回值只能返回一个意图 , 返回哪个由系统决定 ;

广播接收者注册方法有两种功能 , 一个是注册广播接收者 , 另一个是获取之前已经发送的相同 Action 的历史广播 ;

这里使用的注册广播接收者的获取历史广播的功能 ;

3 . 代码示例 :

package kim.hsl.bp;import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;public class BatteryUtils {/*** 主动获取当前电池是否在充电 , 即数据线是否插在手机上* @return*/public static boolean isBatteryCharging(Context context){boolean isBatteryCharging = false;// 主动发送包含是否正在充电状态的广播 , 该广播会持续发送IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);// 注册广播接受者Intent intent = context.registerReceiver(null, intentFilter);// 获取充电状态int batteryChargeState = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);// 判定是否是 AC 交流电充电boolean isAc = batteryChargeState == BatteryManager.BATTERY_PLUGGED_AC;// 判断是否是 USB 充电boolean isUsb = batteryChargeState == BatteryManager.BATTERY_PLUGGED_USB;// 判断是否是 无线充电boolean isWireless = batteryChargeState == BatteryManager.BATTERY_PLUGGED_WIRELESS;// 如何上述任意一种为 true , 说明当前正在充电isBatteryCharging = isAc || isUsb || isWireless;return isBatteryCharging;}}

【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )相关推荐

  1. Android监听屏幕解锁和判断屏幕状态

     开发后台服务的时候经常需要对屏幕状态进行判断,如果是想要监听屏幕解锁事件,可以在配置里面注册action为 android.intent.action.USER_PRESENT的广播,则可以监听 ...

  2. 监听屏幕解锁和判断屏幕状态

    开发后台服务的时候经常需要对屏幕状态进行判断,如果是想要监听屏幕解锁事件,可以在配置里面注册action为android.intent.action.USER_PRESENT的广播,则可以监听解锁事件 ...

  3. Android监听来去电通话录音真正可实行方案,可获取电话接通时状态

    最近 经过一段时间研究了Android来去电并且录音的研究,特此作为记录 首先监听来去电并且可以录音得有以下权限: //录音权限 <uses-permission android:name=&q ...

  4. Android踩坑日记:监听软键盘多次调用和刷新系统相册和获取所有相片

    EditText设置监听软键盘删除键(或enter) 一般使用方法 edittext.setOnKeyListener(new View.OnKeyListener(){@Overridepublic ...

  5. js 监听屏幕转动orientationchange 获取横屏状态window.orientation 监听屏幕旋转完成 苹果手机屏幕多次旋转之后window获取的尺寸不对

    监听屏幕转动 // 监听屏幕转动 window.addEventListener('orientationchange',function(){// 这个时候屏幕的尺寸数据还没有变化var orien ...

  6. ios 获取是否静音模式_如何监听iOS设备静音按钮的状态

    通过使用指定方式播放一段极小音频,比较播放的开始和完成时间,来判断当前静音按钮的状态. 我也针对常见的对音量方面的需求做了一个小工具,欢迎大家使用.指正. 2018年9月6日更新: 1.[修正]--A ...

  7. 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/374.html L ...

  8. 查看oracle监听服务状态,(总结)Oracle监听服务lsnrctl参数及查询状态详解

    lsnrctl命令常用参数详解: lsnrctl start 启动指定的监听器 stop 关闭指定的监听器 status 显示监听器的状态.status命令显示监听器是不是活动的,日志与跟踪文件的位置 ...

  9. 亚马逊获取买家信息,店铺申请,ERP系统,MWS迁移SPAPI,SPAPI注册,PII权限获取

    最近收到邮件,亚马逊将于2021年9月30日关闭服务十多年的网络商城服务MWS,只提供SPAPI(Selling Parterner Api)服务,我们也在逐步将自己的MWS程序向SPAPI程序过渡, ...

最新文章

  1. linux——高级网络配置之bond、team网络接口,网络桥接
  2. Vue 3 —— 当 data 和 ref 相同时 运行时错误 [ReferenceError: xxx is not defined]
  3. idea 与springboot 快捷键
  4. 基于RTMP实现Linux|麒麟操作系统下屏幕|系统声音采集推送
  5. snapchat_机器中的幽灵:Snapchat不是移动优先的-完全是另一回事
  6. 【老生谈算法】matlab实现追赶法算法——追赶法算法
  7. 有双面打印功能的打印机,安装驱动后,无法选择自动双面打印的解决方法
  8. toastr 自定义提示
  9. JavaScript栈和队列方法(Array类型)
  10. net share列出了Windows的默认共享(包括C盘)
  11. EasyExcel导出设置表头字体样式和批注
  12. 中关村连夜征集138项黑科技加入肺炎阻击战
  13. 把notepad++添加到右键打开方式(解决 打开方式 没有notepad++编辑器情况)
  14. 耿丹计科16-2大家庭
  15. UltraEdit最新版v27软件下载 程序员必用高级文本编辑器
  16. 图南淘宝开网店运营培训电商课程之学历分析
  17. debian 9 配置ati驱动
  18. Calendar的使用 对于时间的设置,修改,
  19. 打印Diamond钻石图案
  20. GraphQL(win10环境 + nodejs)试用

热门文章

  1. JSON API免费接口
  2. luogu 2014 选课 树上背包
  3. YII2源码阅读:autoload_real.php 22~23行
  4. Linux Java连接MySQL数据库
  5. 关于js私钥加密公钥解密的问题
  6. 查询每日规定时间段内的记录
  7. [BZOJ1724][Usaco2006 Nov]Fence Repair 切割木板
  8. Spring中获取Session的方法汇总
  9. node实战学习纪录
  10. java 11-7String类里的方法的一些案例