app耗电优化之二使用电源管理来安排任务

宁可枝头抱香死,何曾吹落北风中。这篇文章主要讲述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"/>

【app耗电优化之二使用电源管理来安排任务】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">

 










    推荐阅读