app耗电优化之二 使用电源管理来安排任务
PowerManager 电源管理(电源使用管理)。主要管理设备启动,保持活动,休眠,唤醒。其中为了保持任务,提供了PowerManager.WakeLock(唤醒锁)。执行任务时持有这个唤醒锁,就可以防止休眠,从而正常的完成任务。当然,代价就是增加了耗电。 另一种情况,如果任务执行后,没有释放该锁,则设备不会进入休眠,进而更多的增加了耗电。实际上WakeLock是站立在耗电优化的对立面的,但是又有很多场景不的不使用,例如在听音乐,看视频的过程中希望设备休眠么?
因此在很多场景必须考虑使用WakeLock,很多场景有没有必要使用WakeLock。例如使用电子书进行阅读,就需要WakeLock防止灭屏;QQ微信,使用WakeLock保持后台一直运行,可以接收消息。
WakeLock 的使用:
1 添加使用权限
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>
2 具体使用
//创建WakeLock,锁类型是PowerManager.PARTIAL_WAKE_LOCK
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
//获取WakeLock
if(mWakeLock != null){mWakeLock.acquire();} //**********执行任务*************// //释放WakeLock,准许设备进入休眠
if(mWakeLock != null && mWakeLock.isHeld()){mWakeLock.release();}
以上就是最简单的使用方式。最重要的是最有一句mWakeLock.release();一定要确保锁释放。否则耗电是猛烈的。
基于以上阐述,需要关注的优化点如下:
1 使用恰当的锁类型
PowerManager.PARTIAL_WAKE_LOCK 仅仅确保CPU运行,至于屏幕是否常亮,键盘灯都不做保障。一般常用唤醒锁
PowerManager.SCREEN_DIM_WAKE_LOCK 确保CPU运行,以及屏幕保持灰色,键盘灯不作保障。
PowerManager.SCREEN_BRIGHT_WAKE_LOCK 确保CPU,屏幕常亮,且亮度最高,键盘灯不做保持。
PowerManager.FULL_WAKE_LOCK 确保CPU运行,以及屏幕常亮,还有键盘灯常亮。
PowerManager.ACQUIRE_CAUSES_WAKEUP 确保CPU运行,以及屏幕常亮,即便是原来屏幕是灭的也会被点亮,键盘灯不保持。 PowerManager.SCREEN_DIM_WAKE_LOCK 强制打开屏幕和键盘灯。
PowerManager.ON_AFTER_RELEASE 该锁释放后,会持续保持屏幕状态一段年时间。
PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE 和距离传感器一起使用,当通话时,手接近屏幕时灭屏,离开屏幕时亮屏
2 适当的处理持锁时间
有时候不能确定持锁期间任务执行需要多长时间。例如访问网络是可能会超时,导致程序无法执行下去,进一步无法释放锁。基于此在持锁是需要做一个超时限制,超过了定时自然释放锁。
if(mWakeLock != null){mWakeLock.acquire(10000);//持锁1秒后释放}
3 持锁时间越短越好。
此外PowerManager还提供了以下接口
1 gotoSleep() 强行进入休眠
2 wakeup() 强行从休眠进入唤醒
3 userActivity() 向PowerManagerService 报告影响系统休眠的用户活动,重计算灭屏时间,背光亮度等,例如触屏,划屏,power键等用户活动。
以上三个方法不对上层apk开放,而且需要一下两种权限
<uses-permission android:name="android.permission.REBOOT"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>
4 reboot(String reason);重启,非app接口。添加权限android.permission.REBOOT。
其他保持亮屏方式,这些只是对屏幕耗电的调整,对当前window有效
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //当锁屏是任然可以显示该Window。
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON //当Window对于用户可见时,则处于高亮
| WindowManager.LayoutParams.FLAG_TRUE_SCREEN_ON); //当使用Activity的时候能够点亮屏幕
或者
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:keepScreenOn="true">
其他耗电优化方法请看 app耗电优化
app耗电优化之二 使用电源管理来安排任务的更多相关文章
- app耗电优化之四 使用AlarmManager对任务进行合理安排
AlarmManager 是用来设定定时任务.即用来设定那个任务在什么时候开始执行.为什么和省电有关系?这个需要和AlarmManager的使用先说起.AlarmManager 实际上只起到一个定时发 ...
- 滴滴Booster移动APP质量优化框架 学习之旅 二
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...
- Android APP 性能优化的一些思考
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- Android app 性能优化的思考--性能卡顿不好的原因在哪?
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- 包建强的培训课程(9):Android App性能优化
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Android APP性能优化(最新总结)
导语 安卓大军浩浩荡荡,发展已近十个年头,技术优化日异月新,如今Android 8.0 Oreo 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得And ...
- 滴滴Booster移动APP质量优化框架 学习之旅
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 一.Booster简介 Booster是滴滴最近开源一个的移动应 ...
- 转 cocos2dx内存优化 (之二)
一.cocos2dx之如何优化内存使用(高级篇) 本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=93 一.内存优化原则 为了优化应用内存,你应该知道 ...
- iOS性能优化篇 —— 耗电优化总结
手机App耗电的主要来源有以下四个因素: CPU处理,Processing 网络,Networking 定位,Location 图像,Graphics 耗电优化最终目的:通过尽可能降低CPU ...
随机推荐
- JVM-6.即时编译器
一.即时编译器 二.运行模式 三.基本原理 四.编译优化技术 五.Java与C/C++的编译器对比 六.参考 一.即时编译器 1.在部分虚拟机(如Hotspot.IBM J9)中,Java ...
- javaCV开发详解之6:本地音频(话筒设备)和视频(摄像头)抓取、混合并推送(录制)到服务器(本地)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- git代码回滚
有时候我们用git提交代码后发生了错误,代码冲突了啊等等,我们需要将代码回到以前的某个版本 git代码回退有两种办法 一.git reset(推荐): 它是将最新的commit删除,用以前的某个版本的 ...
- git clone https://github.com/istester/ido.git ,确提示“Failed to connect to 192.168.1.22 port 8080: Connection refused” 的解决办法 。
不知道是否有同学遇到如下的问题: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo } span.s1 { } git clone ...
- Angularjs1.2版本与1.3版本中控制器的问题
写写今天用ng遇到的一个问题吧.因为刚学习就学视频里面写例子,视频里用的是ng1.2.10版本,我用的是1.5.0. 刚开始的时候我按照ng视频的里面的写,但是控制器就是不能绑定好,后来和同学讨论加搜 ...
- [转] 传说中的WCF(2):服务协定的那些事儿
上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗? 其实,这些问题的答案全取决于你的心态,都说“态度决定一切”,这句话,不知道各位信不信,反正我是信了.首先,敢于 ...
- Java中的事件监听机制
鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...
- 这是您一直期待的所有iOS 11功能的屏幕截图
Tips 原文作者:Chris Mills 原文地址:Here's all the iOS 11 screenshots you've been waiting for 除非你已经深陷VR其中,否则现 ...
- PHP数字价格格式化,保留两位小数
number_format(($v['cash']/100),2); demo=>9,271.15
- JS组件系列——自己动手扩展BootstrapTable的 冻结列 功能:彻底解决高度问题
前言:一年前,博主分享过一篇关于bootstrapTable组件冻结列的解决方案 JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案 ,通过该篇,确实可以实现bo ...