《Android优化专题》——优化电池续航能力

一、监测设备的电量和充电状态

在用户充电时,程序做任何操作都不会太受到电量影响,此时就适合做一些下载,刷新数据等耗电操作。

1. 判断当前充电状态

BatteryManager会广播Sticky intent,我们不需要注册BroadcastReiver,

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

Intent batteryStatus = context.registerReceiver(null, ifilter);

// Are we charging / charged?

int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);

boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||

status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?

int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);

boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;

boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;

通过判断设备此时是不是通过AC充电器,USB充电,不在充电状态三种情况来进行是否耗电操作,通常做法是,在使用AC充电时最大化后台更新操作,在使用USB充电时降低更新操作,不在充电状态时,最小化更新操作。

2. 监测充电状态的改变

充电状态随时改变,通过检查充电状态的改变,来改变App的某些行为。我们需要在Manifest文件里面注册一个监听来接收ACTION_POWER_CONNECTED and ACTION_POWER_DISCONNECTED的intent。

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 == BATTERY_PLUGGED_USB;

boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;

}

}

3. 判断当前电池电量

对于一些情况,获取当前电量对于我们是否要进行某个级别的后台操作十分有意义。我们可以从获取电池状态的intent中提取电池电量和容量信息。

int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);

int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

4. 检测电量的有效改变

检测电量的有效改变,包括电量进入低电量模式,充电后离开低电量模式,这两种状态的变更是值得我们关注的。我们仅仅需要监听ACTION_BATTERY_LOW与ACTION_BATTERY_OKAY.

对于设备进入低电量模式我们要尤其注意,这个时候的任何更新、下载等操作是非常影响用户体验,尤其还有可能下载到一半设备就已经关机了。

二、判断设备的停驻模式

Android设备有好几种停驻状态,为设备充电,包括车载模式,家庭模式,数字对战模拟模式。停驻状态与充电状态是非常密切相关联的。

1. 判断当前停驻状态

停驻状态的广播内容是sticky intent,所以不需要注册广播

IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);

Intent dockStatus = context.registerReceiver(null, ifilter);

int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1);

boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;

2. 判断当前停驻类型

Car

Desk

Low-End (Analog) Desk:API level 11开始才有

High-End (Digital) Desk:API level 11开始才有

boolean isCar = dockState == EXTRA_DOCK_STATE_CAR;

boolean isDesk = dockState == EXTRA_DOCK_STATE_DESK ||

dockState == EXTRA_DOCK_STATE_LE_DESK ||

dockState == EXTRA_DOCK_STATE_HE_DESK;

3. 监测停驻状态或者类型改变

只需要像下面一样注册监听器

三、判断并监测网络连接状态

通过网络的连接状况改变,相应改变app的行为,减少无谓的操作,从而延长设备的续航能力。

1. 判断当前是否有网络连接

检查是否有网络连接

ConnectivityManager cm =

(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

boolean isConnected = activeNetwork.isConnectedOrConnecting();

2. 判断连接网络的类型

分为移动网络,WiMax,Wi-Fi,以太网等连接类型

boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;

使用移动网络比WI-FI代价更大,多数情况下,移动网络下减少一些数据的获取操作,在有WIFI的情况下才开始。

3. 监测网络连接的切换

在manifest文件中注册一个带有action的Receiver

当然我们也没必要不间断地监听网络改变,我们只需要在完成某件任务时而进行监测即可。

4. 切换是否开启这些Receivers来提高效率

通过使用PackageManager来切换任何一个在mainfest定义好的组件开启状态,可以使用下面的方法来开启或者关闭任何一个broadcast receiver:

ComponentName receiver = new ComponentName(context, myReceiver.class);

PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager.DONT_KILL_APP)

如果判断到了网络连接已经断开,可以在这个时候关闭除了网络环境改变之外的所有Receivers

android 电池续航时间,《Android优化专题》——优化电池续航能力相关推荐

  1. android系统功耗优化(2)---Android最佳实践之性能 - 电池续航时间优化

    Android最佳实践之性能 - 电池续航时间优化 Doze和App Standby的优化(API23) 参考地址:http://developer.android.com/training/moni ...

  2. Android最佳实践之性能 - 电池续航时间优化

    Doze和App Standby的优化(API23) 参考地址:http://developer.android.com/training/monitoring-device-state/doze-s ...

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

    当你想通过减少后台更新服务的更新频率来降低程序对电池的影响时,检查电池当前的电量和充电状态将是一个比较好的起点. 程序更新对电池造成的影响将取决于当前电池电量和充电状态,比如说,当设备正在充电的时候, ...

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

    当你想通过减少后台更新服务的更新频率来降低程序对电池的影响时,检查电池当前的电量和充电状态将是一个比较好的起点. 程序更新对电池造成的影响将取决于当前电池电量和充电状态,比如说,当设备正在充电的时候, ...

  5. Android设备的电池续航时间优化(Optimizing Battery Life)

    "每当谈及移动智能设备的瓶颈,大家首先想到的总是电池续航能力.电池续航时间不仅与设备的硬件有关,还与运行在设备中的应用程序紧密相关. 在电池自身容量无法在短时间内获得大幅提升的情况下,通过优 ...

  6. Android App优化之延长电池续航时间

    禁用广播接收器 确保广播接收器在真正须要时才运行指令,在onResume中当中广播接收器,在onPause中禁用. 在manifest文件里声明广播接收器时,事先默认配置成禁用的 <receiv ...

  7. Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态

    原文地址:http://android.xsoftlab.net/training/monitoring-device-state/index.html 引言 作为一款优秀的APP应用,应该总是想方设 ...

  8. android源生setting华为,Android 设置默认桌面,默认应用,辅助功能,电池优化,设备管理器,悬浮窗等...

    Android 部分系统设置桌面,默认应用,辅助功能,电池优化,设备管理器,悬浮窗,有权限查看使用情况,开机自启动,锁屏不清理等 部分功能适配了华为手机与小米手机. 设置默认桌面: //华为手机上 I ...

  9. android 电池续航时间,如何提高安卓手机电池续航能力 这份省电指南拿好

    如何提高安卓手机电池续航能力 这份省电指南拿好 2018年11月21日 17:42作者:BOBO编辑:陈燕玲文章出处:泡泡网原创 分享 对于 Android 用户来说,设备的续航可能是一个令人困扰的难 ...

最新文章

  1. python template open_python and Template.
  2. 简述sqlite数据库的特点_为什么要用SQLITE?SQLITE数据库优点和缺点分析
  3. 数据流图中flow不显示文字_利用Flow来进行旋转流体仿真
  4. WORD常用版式保存为模板?
  5. Git之同一台电脑连接多个远程仓库
  6. RocketMQ-PushConsumer配置参数详解
  7. QList、QVector、QMap容器类
  8. 操作系统—死锁的预防
  9. 设计与人工智能设计师
  10. 加密狗破解教程-数据抓取工具
  11. 在CentOS7上安装Mysql,无法启动提示错误:Failed to initialize DD Storage Engine
  12. 茶道形式、用具及要素
  13. 如何通过TXT文件批量生成DataMatrix码
  14. Windows平台下GTK 窗口在任务栏的隐藏问题以及解决办法
  15. 支持tcam的服务器,一种支持TCAM规则更新与压缩方法.doc
  16. java中的push方法_Java ArrayDeque push()方法与示例
  17. mysql删除大表更快的drop table办法(转老金)
  18. 银河麒麟+FT2000源码安装Qt
  19. 算法简介及计算机算法基础——算法学习(四)
  20. 阿里某员工:存够一百万不想再做程序员,回老家过简单生活

热门文章

  1. mpi和openmp混合编程的优点_混合云:拥抱云计算的未来!
  2. 用NVAPI获取GPU信息
  3. 毕业一年总结分享一些工作经验[PHP开发]
  4. Eclipse用法和技巧十二:快速复制一行
  5. mysql nginx 无法访问_nginx可以启动成功却无法访问
  6. 压缩 质量不变_来了!业内首个HEIF图像高质量压缩FPGA加速方案
  7. 5Python全站之路系列之MySL连表查询
  8. h标签在seo中的作用(技术优化)
  9. SUSE Labs Con 2018有感
  10. yii2过滤器(filter)