为什么优化

现在智能手机基本能一天一充,如果一个应用耗电过多,肯定是有问题的,而开发中电量的优化可能是最容易被忽略的。

如何检测

1、手机设置-电池使用情况,查看电量消耗;

2、使用 Battery Historian配置电池使用情况。

优化方案

监控充电状态和电池电量

确定当前充电状态IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

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

简单地调用 registerReceiver 传入 null 作为接收器来注册 BroadcastReceiver,便可返回当前电池状态 Intent。

// 充电状态

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

boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||

status == BatteryManager.BATTERY_STATUS_FULL;

Log.d("wxl", "isCharging=" + isCharging);

Toast.makeText(this,"isCharging=" + isCharging,Toast.LENGTH_LONG).show();

// 设备是通过 USB 还是交流充电器进行充电

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

boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;

boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

Log.d("wxl", "usbCharge=" + usbCharge + ",acCharge=" + acCharge);

Toast.makeText(this,"usbCharge=" + usbCharge + ",acCharge=" + acCharge,Toast.LENGTH_LONG).show();

监控充电状态变化

清单文件中注册一个 BroadcastReceiver,通过在一个 Intent 过滤器内定义 ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED 来同时侦听这两种事件。

PowerConnectionReceiver

public class PowerConnectionReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);

String batteryStatus = "";

switch (status) {

case BatteryManager.BATTERY_STATUS_CHARGING:

batteryStatus = "正在充电";

break;

case BatteryManager.BATTERY_STATUS_DISCHARGING:

batteryStatus = "正在放电";

break;

case BatteryManager.BATTERY_STATUS_NOT_CHARGING:

batteryStatus = "未充电";

break;

case BatteryManager.BATTERY_STATUS_FULL:

batteryStatus = "充满电";

break;

case BatteryManager.BATTERY_STATUS_UNKNOWN:

batteryStatus = "未知道状态";

break;

}

Toast.makeText(context, "batteryStatus=" + batteryStatus, Toast.LENGTH_LONG).show();

int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, BatteryManager.BATTERY_PLUGGED_AC);

String chargePlug = "";

switch (plugged) {

case BatteryManager.BATTERY_PLUGGED_AC:

chargePlug = "AC充电";

break;

case BatteryManager.BATTERY_PLUGGED_USB:

chargePlug = "USB充电";

break;

case BatteryManager.BATTERY_PLUGGED_WIRELESS:

chargePlug = "无线充电";

break;

}

Toast.makeText(context, "chargePlug=" + chargePlug, Toast.LENGTH_LONG).show();

}

}

注册

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);

this.registerReceiver(new PowerConnectionReceiver(), intentFilter);

监控电池电量变化

清单文件中注册一个 BroadcastReceiver,通过侦听 ACTION_BATTERY_LOW 和 ACTION_BATTERY_OKAY,每当设备电池电量不足或退出不足状态时,便会触发该接收器。

BatteryLevelReceiver

public class BatteryLevelReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

//当前剩余电量

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

//电量最大值

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

//电量百分比

float batteryPct = level / (float) scale;

Log.d("wxl", "batteryPct=" + batteryPct);

Toast.makeText(context, "batteryPct=" + batteryPct, Toast.LENGTH_LONG).show();

}

}

注册

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);

this.registerReceiver(new BatteryLevelReceiver(), intentFilter);

通常,如果设备连接了交流充电器,您应该最大限度提高后台更新的频率;而如果设备是通过 USB 充电,则应降低更新频率,如果电池正在放电,则应进一步降低更新频率;在电池电量极低时停用所有后台更新。

屏幕保持常亮

当设备从休眠状态中,被应用程序唤醒一瞬间会耗电过多,我们可以保持屏幕常亮来节省电量,代码声明:

//屏幕保持常亮

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

//一般不需要人为的去掉 FLAG_KEEP_SCREEN_ON 的 flag,windowManager 会管理好程序进入后台回到前台的的操作

//getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

或者,直接在布局中加上 keepScreenOn=true :

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:keepScreenOn="true"

tools:context="com.wuxiaolong.batterysample.MainActivity">

JobScheduler 使用

需要在稍后的某个时间点或者当满足某个特定的条件时执行一个任务,例如当设备接通电源适配器或者连接到 WIFI,在 API 21,google 提供了一个新叫做 JobScheduler API 的组件来处理这样的场景。JobScheduler API 允许同时执行多个任务,执行某些指定的任务时不需要考虑时机控制引起的电池消耗。官方 demo 地址:https://github.com/googlesamples/android-JobScheduler

低电耗模式和应用待机模式

从 Android 6.0(API 级别 23)开始,Android 引入了两个省电功能,可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命。低电耗模式通过在设备长时间处于闲置状态时推迟应用的后台 CPU 和网络 Activity 来减少电池消耗。应用待机模式可推迟用户近期未与之交互的应用的后台网络 Activity。

低电耗模式

如果用户设备未插接电源、处于静止状态一段时间且屏幕关闭,设备会进入低电耗模式。 在低电耗模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电量。这还可以阻止应用访问网络并推迟其作业、同步和标准闹铃。

在低电耗模式下,您的应用会受到以下限制:暂停访问网络。

系统将忽略 wake locks。

标准 AlarmManager 闹铃(包括 setExact() 和 setWindow())推迟到下一维护时段。如果您需要设置在低电耗模式下触发的闹铃,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。

一般情况下,使用 setAlarmClock() 设置的闹铃将继续触发 — 但系统会在这些闹铃触发之前不久退出低电耗模式。

系统不执行 Wi-Fi 扫描。

系统不允许运行同步适配器。

系统不允许运行 JobScheduler。

低电耗模式很容易影响 AlarmManager 闹铃和定时器管理的 Activity,因为当系统处于低电耗模式时,不会触发 Android 5.1(API 级别 22)或更低版本中的闹铃。

为了帮助您安排闹铃,Android 6.0(API 级别 23)引入了两种新的 AlarmManager 方法:setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle()。通过这些方法,您可以设置即使设备处于低电耗模式也会触发的闹铃。

应用待机模式

应用待机模式允许系统判定应用在用户未主动使用它时处于空闲状态。 当用户有一段时间未触摸应用时,系统便会作出此判定,以下条件均不适用:用户显式启动应用。

应用当前有一个进程位于前台(表现为 Activity 或前台服务形式,或被另一 Activity 或前台服务占用)。

应用生成用户可在锁屏或通知托盘中看到的通知。

当用户将设备插入电源时,系统将从待机状态释放应用,从而让它们可以自由访问网络并执行任何待定作业和同步。 如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲应用访问网络。

android的电池优化,Android 电量优化相关推荐

  1. 【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )

    文章目录 一.AlarmManager 简介 二.使用 AlarmManager 保持 CPU 唤醒流程 ( 省电操作 ) 三.使用 WeakLock 保持 CPU 唤醒 代码示例 1.Service ...

  2. 【Android 电量优化】电量优化 ( Battery Historian 环境要求 | 电量分析报告 | 电量优化三原则 | 电量优化注意事项 )

    文章目录 一.Battery Historian 环境要求 二.上传电量报告 三.Battery Historian 电量分析报告 四.电量优化三原则 五.电量优化注意事项 参考 Google 官方文 ...

  3. Android 进阶——性能优化之电量优化全攻略及实战小结(二)

    文章大纲 引言 一.在低电耗模式和应用待机模式下进行测试 1.在低电耗模式下测试您的应用 2.在应用待机模式下测试您的应用 3.列入白名单的可接受用例 4.确定当前充电状态 5.监控充电状态变化 6. ...

  4. Android App优化:内存优化、电量优化、网络优化等 (2)

    -- 优化专题: 整理一系列的专题:比如APK瘦身.插件化.程序架构.性能优化.自定义view.增量升级.移动开发各种技术解决方案等.   Android后期发展的五大趋势:一.性能优化:二.高级UI ...

  5. 【Android 电量优化】电量优化 ( 获取电量分析报告 | 阿里云服务器搭建 Battery Historian | 上传并生成分析报告 )

    文章目录 一.Battery Historian 搭建环境 二.获取 Android 手机电量报告 1.重置电量状态 2.开启获取 WeakLock 信息 3.获取手机电量报告 三.阿里云服务器搭建 ...

  6. 【Android 电量优化】电量优化特性 ( Doze 低电耗模式 | Standby 应用待机模式 | 白名单设置 | 白名单添加系统设置界面 | 指定应用的白名单添加界面 | 测试应用 )

    文章目录 一.Doze 低耗电模式简介 二.Standby 应用待机模式简介 三.Doze 和 Standby 模式测试 四.白名单添加 ( 方式一 ) 五.白名单添加 ( 方式二 ) Android ...

  7. 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI 状态 | 被动获取 WIFI 状态 )

    文章目录 一.获取 WIFI 状态 二.主动获取 WIFI 状态 三.被动获取 WIFI 状态 参考 Google 官方文档 : 优化电池续航时间 一.获取 WIFI 状态 在应用中执行某些操作 , ...

  8. 【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )

    文章目录 一.获取充电状态 二.被动获取充电状态 三.主动获取充电状态 参考 Google 官方文档 : 优化电池续航时间 一.获取充电状态 在应用中执行某些操作 , 如软件云端备份 , 从服务器端获 ...

  9. 【Android 电量优化】电量优化 ( 唤醒锁定 | 使用 WeakLock 保持服务唤醒 | 屏幕唤醒 )

    文章目录 一.使用 WeakLock 保持 CPU 唤醒 ( 费电操作 ) 1.保持 CPU 唤醒 2.使用 WeakLock 保持 CPU 唤醒流程 3.使用 WeakLock 保持 CPU 唤醒代 ...

  10. 【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask )

    文章目录 一.JobScheduler 使用流程 二.AsyncTask 简介 三.JobScheduler 开发流程 四.JobScheduler 代码示例 1.JobScheduleManager ...

最新文章

  1. 当进度对话框和后台线程处于活动状态时,如何处理屏幕方向变化?
  2. UGUI实现接口事件
  3. POJ 2965.The Pilots Brothers‘ refrigerator
  4. DEM挖填方分析--基于水平参考面计算
  5. powershell 启动线程与关闭线程
  6. aws cognito_AWS Cognito的用户管理—(2/3)核心功能
  7. Python+django网页设计入门(6):文件上传与数据导入
  8. 《统一沟通-微软-实战》-6-部署-7-部署移动功能-1
  9. 如何求地球上两点之间的最短距离_高三数学这样复习“最高效”,稳稳120+!...
  10. (转)对冲基金投身“另类数据”淘金热
  11. Idea 文件定位图标显示与关闭 -- idea ver:2020.1
  12. ESP8266烧录选项中的QIO 和 DIO解释
  13. Python——飞机大战(day10)
  14. java解决异常_聊聊Java中的异常及处理
  15. Openwrt编译feeds机制
  16. Ubuntu系统环境
  17. R语言入门1---R语言介绍以及学前注意事项
  18. c语言文件处理中ab,C语言文件处理中wt是什么操作方式?
  19. 张勋说:耐磨钢球简介
  20. 使用主密钥和钱包方法加密数据

热门文章

  1. 后台俱乐部管理员管理俱乐部_开放组织读书俱乐部:拥抱摩擦
  2. IPO倒计时,比亚迪半导体开启新鏖战
  3. ubuntu硬盘序列号怎么查询_Linux下使用lshw批量查看磁盘信息|序列号|列表
  4. undefined symbol: __gmpz_limbs_write 问题分析和解决
  5. codeforces 702C Cellular Network
  6. 海盗王2020年的新版本,非常不错
  7. WIN7系统的桌面突然不好使了,右键没反应,桌面上所有的图标点击都没反应explorer
  8. [锁]:乐观锁、悲观锁与死锁
  9. C语言的库函数、自定义函数、嵌套函数,以及递归函数
  10. 2060显卡驱动最新版本_海岛大亨6中文版即将更新 铭瑄显卡胜任“游戏大佬”