WakeLock的介绍与使用
来源:互联网 发布:达内软件科技 编辑:程序博客网 时间:2024/06/07 04:42
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标志
这是一个窗口标志,只要窗口是可见的,则设备的屏幕会一直保持打开和常亮。 0 0
- WakeLock的介绍与使用
- Android关于PowerManager.WakeLock的使用相关介绍
- PowerManager.WakeLock的使用
- wakelock的使用
- WakeLock的使用
- Android WakeLock的使用
- wakelock的使用
- PowerManager.WakeLock的简单使用
- WakeLock使用
- WakeLock使用
- Android之wakelock的简单使用
- Event auto wakelock 介绍
- Android WakeLock 介绍
- Linux wakelock与autosleep
- WakeLock使用笔记
- android中使用wakelock
- Android 使用WakeLock
- PowerManager.WakeLock使用Demo
- CSS3的布局样式相关
- 机会来自于颠覆旧的商业模式
- 为什么构造函数中调用的虚函数不具有多态性?
- 第八届 蓝桥杯 分巧克力
- IP地址、网关、子网掩码快速切换批处理(windows bat)
- WakeLock的介绍与使用
- 将二叉树拆成链表
- Java中如何动态创建接口的实现
- HttpClient简单操作
- android 从系统图库中选择图片
- SMSC--kernel4.10网卡驱动之移植编写(一)(未完)
- 关于java多态的理解
- 【NOI2015T4】荷马史诗-优先队列实现K进制哈夫曼编码+贪心
- ubuntu下的压缩与解压缩&文件复制