Android动态获取手机是否是充电状态

这篇具有很好参考价值的文章主要介绍了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";

    @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 . 代码示例 :文章来源地址https://www.toymoban.com/news/detail-402690.html

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动态获取手机是否是充电状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp获取手机号(前端部分,仅供参考~)

    html部分 js部分 api部分

    2024年02月09日
    浏览(43)
  • 【Android】【root & remount 】【1】java中如何判断设备是否在root状态

    前言 客户需求,需要判断设备是否执在root状态。可以理解为是否执行了adb root 设置root状态,已经adb unroot设置unroot状态。 代码分析 分析adb deamon发现:在执行adb root 、adb unroot指令时,系统会更新service.adb.root 变量。 实现 系统应用可以通过SystemProperties get ”service.adb.root“ v

    2024年04月16日
    浏览(39)
  • Android studio进入手机调试状态

    首先usb插入电脑 手机打开开发者模式 进入 点击 就会在你的页面显示了

    2024年02月06日
    浏览(35)
  • 【Android】获取导航栏、状态栏高度

    或者 或者 系统的各种数据定义位于SDK的xml文件中: android-30/data/res/values/dimens.xml 通过key可以获取对应的值。 导航栏和状态栏源码相似 调用 updateColorViews 更新背景色的方法,还有如下位置: WindowInsets 可以翻译为窗口附加物,一般是指一个界面中,不由开发者直接控制的部分

    2024年02月12日
    浏览(35)
  • Android 获取网络连接状态新方法

            Android12上,有的app模块判断当前网络的类型和连接状态时,还是使用的旧的API,导致返回的结果不准确,影响代码逻辑判断,本篇文章就这一问题,整理一下判断网络类型和连接状态的新方法。         在Android 10以前的版本,大家都是通过NetworkInfo.java 的get

    2024年02月08日
    浏览(23)
  • Android 11以上获取不到第三方app是否安装

    开年第一篇,处理了一下年前的小问题。 问题:本地app跳转到第三方app地图进行导航,获取不到第三方地图是否安装。 解决: 1.添加包名  This can be done by adding a  queries  element in the Android manifest.在app下的manifest文件内manifest标签下添加 queries标签设置包名 2.MapUtil工具类 3.调用

    2024年02月19日
    浏览(33)
  • Android监测手机网络状态变化的广播

    @Override public void onReceive(Context context, Intent intent) { int netWorkStates = NetworkUtil.getNetWorkStates(context); switch (netWorkStates) { case NetworkUtil.TYPE_NONE: //断网了 break; case NetworkUtil.TYPE_MOBILE: //打开了移动网络 break; case NetworkUtil.TYPE_WIFI: //打开了WIFI break; default: break; } } } 上述代码中使用到了Ne

    2024年04月12日
    浏览(34)
  • Android完美获取状态栏高度、标题栏高度、编辑区域高度的获取

    获取状态栏高度——方法3 应用区的顶端位置即状态栏的高度 注意 该方法不能在初始化的时候用 */ Rect rectangle= new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle); //高度为rectangle.top-0仍为rectangle.top Log.e(“WangJ”, “状态栏-方法3:” + rectangle.top); 看结果: *注意* 如果

    2024年02月02日
    浏览(30)
  • Android应用开发(23)获取亮灭屏状态

    Android应用开发学习笔记——目录索引 在android 应用程序获取亮灭屏状态的常用方法有: 使用PowerManager提供的API函数 注册Broadcast监听 frameworks/base/core/java/android/os/PowerManager.java 使用PowerManager的API函数isInteractive()在应用程序中使用非常简单:在需要获取的地方调用一下即可。 百

    2024年02月15日
    浏览(31)
  • 一起Talk Android吧(第五百四十六回:如何判断手机是否安装GooglePlay)

    各位看官们大家好,上一回中咱们说的例子是\\\"如何实现流水动画\\\",本章回中介绍的例子是\\\" 如何判断手机是否安装GooglePlay \\\"。闲话休提,言归正转,让我们一起Talk Android吧! 我们在这里说的 GooglePlay 就是Google的应用市场,它本质上也是应用程序,只是在国内无法使用,因此部

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包