Android动态获取手机是否是充电状态
参考谷歌官方文档:https://developer.android.google.cn/topic/performance/power
一、获取充电状态
在应用中执行某些操作 , 如软件云端备份 , 从服务器端获取最新版本号 , 从服务器端缓存最新软件安装包 , 固件版本 , 等操作 , 最好都在充电状态 ,
我这边是做一个需求,电池容量校准,校准条件是需要在连接充电器的情况下(并且是快充),那么如何获取充电状态呢 , 这里使用了广播机制,给出两个方式 , 分别是主动获取充电状态 , 被动获取充电状态 ;
① 监听方法 : 注册广播接受者 , 监听充电状态变化 ;
② 场景描述 : 当用户插拔数据线时 , 充电状态发生变化时 , 系统发出对应的广播 , 使用广播接受者接收这些广播 ;
③ 数据线插入广播 : 当数据线插入时 , 系统会发出 Intent.ACTION_POWER_CONNECTED 广播 ;
④ 数据线拔出广播 : 当数据线拔出时 , 系统会发出 Intent.ACTION_POWER_DISCONNECTED 广播 ;
二、被动获取充电状态
1 . 被动获取充电状态 :
① 监听方法 : 注册广播接受者 , 监听充电状态变化 ;
② 场景描述 : 当用户插拔数据线时 , 充电状态发生变化时 , 系统发出对应的广播 , 使用广播接受者接收这些广播 ;
③ 数据线插入广播 : 当数据线插入时 , 系统会发出 Intent.ACTION_POWER_CONNECTED 广播 ;
4.数据线拔出广播 : 当数据线拔出时 , 系统会发出 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 BatteryGetReceiver 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 对应的值 , 与以下 3 3 3 个值进行对比 , 如果一致 , 说明当前是此种充电状态 ;
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动态获取手机是否是充电状态相关推荐
- Android 如何判断手机处于电源充电状态还是USB连接状态?
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatusIntent = ...
- Android适配 获取手机屏幕的分辨率
如何将一个应用程序适配在不同的手机上,虽然这不算是一个技术问题,但是对于刚刚做屏幕的开发人员来说,还真不是一件多么简单的事情. 首先:你需要在AndroidManifest.xml文件的<man ...
- android 自动获取手机验证码
真的很奇怪大家的复制粘贴功能,一篇自动获取手机验证码的文章各大平台争相转发,我以为很牛逼,到后来发现不能用,可能我技术不够吧,复制粘贴还不到家. android 自动获取手机验证码好处 :① 用户不用 ...
- Android杂谈---获取手机屏幕大小
Android杂谈---获取手机屏幕大小 SurfaceView简单例子 玩转Android---UI篇---ZoomControls放大缩小图片 更多相关推荐 这里总结下android中关于手机屏幕 ...
- Android动态获取图片资源
Android动态获取图片资源 根据文件名反向查找图片, 好像没有读取转换成数据流,性能应该不错. 回去后试试. 1. Field f= (Field)R.drawable.class.getDecl ...
- android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法
android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法 1)获取运营商sim卡imsi号: String android_imsi = telephonyManager.getSub ...
- Android之获取手机内部及sdcard存储空间
Android之获取手机内部及sdcard存储空间 文章链接 知识点: 内部存储空间获取总大小和可用大小: sdcard存储空间获取总大小和可用大小: 新名词记录{StatFs:描述文件系统信息的类} ...
- android获取存储设备根目录,Android ndk获取手机内部存储卡的根目录方法
如下所示: jclass envcls = env->FindClass("android/os/Environment"); //获得类引用 if (envcls == n ...
- 自制USB充电接口,手机不显示充电状态的原因
使用环境(蓝色粗体字为特别注意内容) 1.硬件环境:自制USB充电接口.手机 2.参考文献:http://bbs.21ic.com/icview-2509454-1-3.html 这个问题是由于手机内 ...
最新文章
- java aws访问授权 实例_java – 使用IAM身份验证和Spring JDBC访问AWS ...
- 【STM32-V7】STM32H743XIH6开发板,丰富软件资源,强劲硬件配置,大量软件解决方案持续更新中(2020-07-22)
- linux c implicit declaration of function 警告的解决方法
- labview运行excel宏_LabVIEW编程实例:电子表格文件的读写操作方法
- 前端学PHP之文件操作
- MySQL数据库存储过程动态表建立(PREPARE)
- UA OPTI544 量子光学11 Maxwell-Bloch方程
- 2021阿里巴巴大数据技术公开课第一季:外部工具连接SaaS模式云数仓MaxCompute实战
- 变量的定于[指针/函数指针]
- 如何安装ipython notebook_IPython notebook安装指导
- Java虚拟机JVM的内存管理
- DC.SetMapMode()的用法记录
- 绿盟科技:“无敌舰队”DDoS勒索防御关键是应急经验积累
- 一路PN码串行捕获设计--基于《通信收发信机的verilog实现与仿真》实例
- 高尔顿钉板实验的matlab代码动画演示
- 【小编教你有效的保护视力】
- Python之You-Get库学习
- Yamaha DGX660 电钢琴aux-in只响一边的处理记录
- 【数据库】GaussDB客户端工具介绍
- 【如何学习Kotlin 开发?《Kotin 移动和服务器端应用开发》告诉你】
热门文章
- 520情人节程序员的浪漫告白~html+css+js浪漫星空❤爱心3D相册 (含音乐)
- go benchmark 基准测试
- Mac下Chrome快捷键大全
- PPT学习和制作笔记--版面设计
- java中uploadify_java 上传3(uploadify中文api)
- 大数据技术之Hive
- Codeforces Round #843 (Div. 2) 口胡日记(青大蒟蒻日常掉大分)
- 前端页面布局之双飞翼布局
- 计算机网络技术专业做销售,现在在书店做销售员的实习报告怎样写?
- 特征匹配-NNDR策略,kd树,BBF算法