Android设备的电池续航时间优化(Optimizing Battery Life)——(一)监听电池电量和电池的充电状态

简介: 当你想通过减少后台更新服务的更新频率来降低程序对电池的影响时,检查电池当前的电量和充电状态将是一个比较好的起点。

当你想通过减少后台更新服务的更新频率来降低程序对电池的影响时,检查电池当前的电量和充电状态将是一个比较好的起点。

程序更新对电池造成的影响将取决于当前电池电量和充电状态,比如说,当设备正在充电的时候,这时的更新对电池的影响是微不足道的,所以这时就是你的程序加大更新力度的最佳时刻。与之相对的是,如果当前设备不是处于充电状态的话,降低程序更新力度对延长续航时间是很必要的。

与之相类似的,如果设备没有处于充电状态,并且是当电池快要用完的时候,这时最好就是将更新力度降到最低甚至是停止更新。

确定电池所处状态

当前电池电量和状态都是通过BatteryManager发送广播,来通知相关的广播接收者的。 个人感觉应该是通过sendStickyBroadcast这种方法发送的广播,这种广播的特点是在广播发送之后,广播的实体Intent会一直存在,意思就是说,在以后调用registerReceiver注册相匹配的Receiver时会把这个Intent对象直接返回给新注册的Receiver,明白这一点对下文是很重要的。

因为BatteryManager广播的是一个stickyintent实体,这就意味着你不用非得注册一个广播接收者来让你的程序接受这个广播,你可以仅仅就是通过调用registerReceiver这个方法,在需要添加广播接收者位置的参数上传入null,当然你也可以新建一个广播接收者,并在注册广播接收者的时候传入。下面是相关代码:

//设置意图过滤器
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
//注册广播接收者,因为BatteryManager发送的是sticky形式的intent,所以接收者可以为空
Intent batteryStatus = registerReceiver(null, ifilter);
//得到电池当前的状态(共有5种,包括unkonwn、charging、discharging、not charging、full)
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
//是否处于充电状态
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ;
//充电方式(共有两种,分别是通过AC充电和通过USB端口进行充电)
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
//打印相关信息
Log.i("MyBroadcastReceiverActivity","isCharging:"+isCharging+"\nusbCharge:"+usbCharge + "\nacCharge:"+ acCharge);

注意这里是使用的模拟器,其结果如下:


更新程序的最佳时机是:电池状态是使用AC充电状态时,当是使用USB端口进行的充电时,应降低更新频率,当不处于通电状态时,更要降低程序更新频率。

监听电池状态变化

当设备插上电源开始充电时,电池状态便发生了变化,所以对程序员来说,通过监听电池状态的变化来进行相应的更新操作是很重要的。

当设备连上电源或与电源断开连接时,BatteryManager都会发送一个广播。即使这时,你的程序不是出于运行状态,接收这些电池状态变化的信息也是很有必要的,因为你可以控制在后台是否进行相应的更新操作,所以应该为你的程序注册一个广播接收者,来监听接上电源和与电源断开两种状态。这里通过AndroidManifest.xml进行广播接收者的注册,具体如下:

AndroidManifest.xml中注册一个名为PowerConnectionReceiver的广播接收者:

<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>

PowerConnectionReceiver 这个类,方法中的内容可参看上文:

public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL;
    
        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
        Log.i("PowerConnectionReceiver","isCharing:"+isCharging+"\nusbCharge:"+usbCharge+"\nacCharge:"+acCharge);
}
}


确定当前电池电量

有时候,确定当前电池的电量也是很有必要的,你可以控制当电池电量低于某值时就降低程序频率或者不再进行程序更新,相关代码如下:

//取得当前电池电量
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
//取得电池容量
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
//计算电池电量使用率
float batteryPct = level / (float)scale;
Log.i("MyBroadcastReceiverActivity", "level:"+level+"\nscale:"+scale+"\nbatteryPct:"+batteryPct);

注意,这里仍然是使用的模拟器,结果如下:

监听电池状态的重大变化

一般说来,如果你一直对电池的状态进行监听的话,可能这本身就会对电池造成很大的影响,甚至超过程序本身的影响,这就有点得不偿失了,所以,我们很有必要只监听电池状态的重大变化,比如设备进入了电池电量很低的状态或者从这个状态中出来的时候,下面的代码片段将对这两者情况进行监听,具体如下:

<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>

在广播接收者BatterLevelReceiver类的onReceive方发中,就可以做你想做的了。


下一节,讲介绍怎样确定和监听设备的dock状态和 类型。


相关文章
|
6月前
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
271 64
|
6月前
|
存储 Android开发 数据安全/隐私保护
如何在Android设备上撤销Flutter应用程序的所有权限?
如何在Android设备上撤销Flutter应用程序的所有权限?
356 64
|
6月前
|
缓存 Android开发 开发者
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
1019 62
|
6月前
|
开发工具 Android开发 开发者
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
332 61
|
7月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
280 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
232 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
15天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
205 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
25天前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
96 6
|
3月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
183 11

热门文章

最新文章

  • 1
    Android实战经验之Kotlin中快速实现MVI架构
    344
  • 2
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    211
  • 3
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    555
  • 4
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    854
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    313
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    232
  • 7
    Android历史版本与APK文件结构
    739
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    246
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    262
  • 10
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    491