文章目录

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



参考 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";    @Override    public 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" />    <application        android: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;    }}

更多相关文章

  1. Android(安卓)BroadCast
  2. MotionLayout入门
  3. Android(安卓)Studio 基础 之 获取 Wifi 的状态,设置 Wifi 的开关
  4. Android(安卓)小应用之一个activity实现简易手电筒(内附免费源码)
  5. Android沉浸式模式实现导航栏与状态栏的隐藏,上滑呼出导航栏与状
  6. Android(安卓)如何保证App切换到后台,或页面跳转后,重新打开APP、
  7. Android(安卓)Q暗色模式适配踩坑—状态栏
  8. Android(安卓)管理多个fragment(处理Activity被回收的情况)
  9. 关于 android app 返回键模拟 home键 功能的介绍_仿QQ返回键 又

随机推荐

  1. android中修改tablayout中的字体大小和颜
  2. fill_parent和wrap_content的问题
  3. Android连接SpringMVC配置信息
  4. Android(安卓)studio一些设置项
  5. Android(安卓)10 添加AM/PM在状态栏和锁
  6. Android官方入门文档[15]重新创建一个Act
  7. android 图片叠加效果
  8. 高通平台Android(安卓)N SystemUI添加qcn
  9. Android(安卓)Studio第二十七期 - Recycl
  10. android中的Bitmap用法小结