Android: PowerManager.WakeLock

本文介绍Android中使用PowerManager.WakeLock来控制设备电源状态的方法。详细解释了如何获取、加锁和解锁不同类型的电源锁,包括PARTIAL_WAKE_LOCK、SCREEN_DIM_WAKE_LOCK等,并提供了一些注意事项。

Android中通过各种Lock锁对电源进行控制:

Flag ValueCPUScreenKeyboard
PARTIAL_WAKE_LOCKOn*OffOff
SCREEN_DIM_WAKE_LOCKOnDimOff
SCREEN_BRIGHT_WAKE_LOCKOnBrightOff
FULL_WAKE_LOCKOnBrightBright

private static PowerManager.WakeLock mWakeLock;

PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);

mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);

加锁:

mWakeLock.acquire();

解锁:

mWakeLock.release();

需要注意:

0. WakeLock是activity级的

1. 加锁/解锁必须成对出现

2. 可以多次加锁,同时解锁次数等于加锁次数才能完成解锁

3. 未加锁时进行解锁操作会抛出异常,程序挂掉

可以用下面的方法保证不多次加锁及未加锁时进行解锁:

if (!mWakeLock.isHeld())

mWakeLock.acquire();

if (mWakeLock.isHeld())

mWakeLock.release();

Process: com.android.networkstack.process, PID: 4762 java.lang.IllegalArgumentException: Wakelock.mLock is already dead. at android.os.Parcel.createExceptionOrNull(Parcel.java:3374) at android.os.Parcel.createException(Parcel.java:3354) at android.os.Parcel.readException(Parcel.java:3337) at android.os.Parcel.readException(Parcel.java:3279) at android.os.IPowerManager$Stub$Proxy.acquireWakeLock(IPowerManager.java:1471) at android.os.PowerManager$WakeLock.acquireLocked(PowerManager.java:4194) at android.os.PowerManager$WakeLock.acquire(PowerManager.java:4175) at com.android.networkstack.android.net.ip.IpReachabilityMonitor$Dependencies$1.acquireWakeLock(IpReachabilityMonitor.java:198) at com.android.networkstack.android.net.ip.IpReachabilityMonitor.probeAll(IpReachabilityMonitor.java:572) at com.android.networkstack.android.net.ip.IpClient.handleUpdateL2Information(IpClient.java:2845) at com.android.networkstack.android.net.ip.IpClient.-$$Nest$mhandleUpdateL2Information(IpClient.java:0) at com.android.networkstack.android.net.ip.IpClient$StartedState.processMessage(IpClient.java:3388) at com.android.networkstack.com.android.internal.util.StateMachine$SmHandler.processMsg(StateMachine.java:1002) at com.android.networkstack.com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:820) at android.os.Handler.dispatchMessage(Handler.java:115) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.os.HandlerThread.run(HandlerThread.java:85) Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.power.PowerManagerService$WakeLock.linkToDeath(PowerManagerService.java:6302) at com.android.server.power.PowerManagerService$WakeLock.<init>(PowerManagerService.java:6289) at com.android.server.power.PowerManagerService.acquireWakeLockInternal(PowerManagerService.java:1890) at com.android.server.power.PowerManagerService.-$$Nest$macquireWakeLockInternal(Unknown Source:0) at com.android.server.power.PowerManagerService$BinderService.acquireWakeLock(PowerManagerService.java:6785)
最新发布
11-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值