当前位置: 首页 > backend >正文

WakeLock的介绍与使用

1.什么是WakeLock

WakeLock是一种机制,表示应用需要设备保持运行(stay on)。
WakeLock默认是引用计数,如果WakeLock是引用计数的话,则调用了几次acquire()方法,就需要调用对应次数的release()方法才能真正释放掉WakeLock。
如果WakeLock不是引用计数的话,则调用一次release()函数,就可以释放前面调用多次acquire()获取的WakeLock锁。


2.如果使用WakeLock

使用WakeLock之前,需要在AndroidManifest.xml中声明android.permission.WAKE_LOCK权限。一般是通过使用PowerManager.newWakeLock(int,String)来获取,并指定一个WakeLock类型:
  • FULL_WAKE_LOCK    保持屏幕全亮、键盘背光灯点亮和CPU运行。
  • SCREEN_BRIGHT_WAKE_LOCK   保持屏幕全亮和CPU运行。
  • SCREEN_DIM_WAKE_LOCK   保持屏幕开启(但是让它变暗)和CPU运行。
  • PARTIAL_WAKE_LOCK   保持CPU运行。
例如:
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);  
WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
 通过调用acquire()方法获取Wake Lock对象,并可以指定一个超时值timeout,在该timeout内保持使用该WakeLock。
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);  
WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");  
wakeLock.acquire(10000);//timeout = 10s
// do something that require the CPU is active    
wakeLock.release();  
当你完成了工作 通过调用release()方法释放WakeLock对象。
WakeLock的构造函数如下:
WakeLock(int flags, String tag, String packageName) {mFlags = flags;mTag = tag;mPackageName = packageName;mToken = new Binder();mTraceName = "WakeLock (" + mTag + ")";}
WakeLock带timeout的acquire函数如下:
 public void acquire(long timeout) {synchronized (mToken) {acquireLocked();mHandler.postDelayed(mReleaser, timeout);}}
private void acquireLocked() {if (!mRefCounted || mCount++ == 0) {mHandler.removeCallbacks(mReleaser);Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, mTraceName, 0);try {mService.acquireWakeLock(mToken, mFlags, mTag, mPackageName, mWorkSource,mHistoryTag);} catch (RemoteException e) {}mHeld = true;}}
WakeLock的释放release函数如下:
public void release(int flags) {synchronized (mToken) {if (!mRefCounted || --mCount == 0) {mHandler.removeCallbacks(mReleaser);if (mHeld) {Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);try {mService.releaseWakeLock(mToken, flags);} catch (RemoteException e) {}mHeld = false;}}if (mCount < 0) {throw new RuntimeException("WakeLock under-locked " + mTag);}}}

3.WakeLock的作用

    为了延长电池的使用寿命,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,最后停止CPU。WakeLock是一个电源管理系统服务功能,应用程序可以使用它来控制设备的电源状态。
    WakeLock可以用来保持CPU运行,避免屏幕变暗和关闭,以及避免键盘背光灯熄灭。


4.WakeLock的使用场景

屏幕Wake Lock通常用于在用户观看屏幕但是很少与屏幕进行交互期间(例如,播放视频)防止屏幕变暗。
CPU Wake Lock用于防止设备进入休眠状态,直至执行了一个操作。当服务从意图接收器内启动时常常出现这种情况,因为意图接收器可能在设备休眠期间接收意图。值得注意的是,在这种情况下,系统将在广播接收器的整个onReceive处理程序中使用CPU Wake Lock。

5.WakeLock使用的注意事项

  • 在完成工作后,尽量快速释放wake lock锁,避免把电池耗尽。
  • 使用WakeLock时,尽量使用带timeout的acquire方法,这样即使应用发生了异常,也会自动释放WakeLock。
  • 创建和使用Wake Lock会对应用程序造成的电池电量消耗产生显著的影响。因此,最好只在 确实有必要时使用Wake Lock,并且使用它们的时间越少越好,只要有可 能就释放它们。
  • 避免使用FULL_WAKE_LOCK,而应该使用WindowManger.LayoutParams.FLAG_KEEP_SCREEN_ON,因为使用FLAG_KEEP_SCREEN_ON标志,系统框架会自动处理相关的WakeLock释放与重新获得。
  • FULL_WAKE_LOCK、SCREEN_BRIGHT_WAKE_LOCK  、SCREEN_DIM_WAKE_LOCK 在按下Power电源键后,会被系统自动释放,但是PARTIAL_WAKE_LOCK会保持CPU一直运行,直到partial wake lock已经被释放了。


6.WindowManger.LayoutParams.FLAG_KEEP_SCREEN_ON标志

    这是一个窗口标志,只要窗口是可见的,则设备的屏幕会一直保持打开和常亮。


http://www.xdnf.cn/news/11094.html

相关文章:

  • 【计算机考研408-计算机网络-教书匠视频笔记】主机访问浏览器的全部过程
  • HTML基础教程(非常详细)从零基础入门到精通,看完这一篇就够了。
  • Android开源项目第二篇——工具库篇
  • ModuleNotFoundError:如何解决 no module named Python 错误?
  • 驱动人生深度扫描功能上线!使用感怎么样?
  • 北大计算机学院 教授 湖南人,北大湘籍教授邹恒甫简历
  • 目标世界上最小的Linux系统—ttylinux体验
  • 分享116个图片JS特效,总有一款适合您
  • 免费php空间带域名,freehostia免费250MB无广告PHP空间可绑域名
  • “应用程序配置不正确,程序无法启动” 解决办法(vc2008 sp1)
  • python中if brthon环境安装包_Ant、Gradle、Python三种打包方式的介绍
  • GNS3的RIP协议的动态路由配置
  • 暴力破解之密码字典
  • 由于找不到d3dx9_41.dll文件无法运行程序解决办法
  • WINDOWS常用端口列表
  • HTC G14解锁S OFF 刷机 获取ROOT权限
  • 动态评分查询动态评分怎么刷当流量到来之时
  • 著名电子竞技游戏网站分析
  • open***中server.conf和client.conf配置文件详解
  • 十款ASP的CMS系统排名
  • 路由器也可刷机,开源的Tomato DualWAN
  • Windows IIS服务器安装(超详细)
  • 按键精灵--VS挤房器
  • 【雕爷学编程】MicroPython手册之 Zephyr 磁盘访问
  • 如何使用HTML制作个人网站(如何搭建个人博客)
  • ps切图抠图详解-web前端(转)
  • 使用51单片机制作秒表的详细过程
  • 什么是tftp服务器? 如何搭建tftp服务器?
  • PCB 铜厚厚度和线宽的选择
  • SQL触发器实例