相關的變量:
PowerManager powerManager = null;
WakeLock wakeLock = null;
初始化:
powerManager = (PowerManager) this
.getSystemService(Service.POWER_SERVICE);
wakeLock = this.powerManager.newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK, "My Lock");
開啟屏幕常亮:
wakeLock.setReferenceCounted(false);
wakeLock.acquire();
關閉你的程序設置的屏幕常亮:
wakeLock.release();
注意的地方:我在實際的調試過程中,沒有設置wakeLock.setReferenceCounted(false);這個,報錯為:java.lang.RuntimeException: WakeLock under-locked
閱讀源碼:
acquire()函數如下:
public void acquire()
{
synchronized (mToken) {
if (!mRefCounted || mCount++ == 0) {
try {
mService.acquireWakeLock(mFlags, mToken, mTag);
} catch (RemoteException e) {
}
mHeld = true;
}
}
}
release()函數如下:
public void release()
{
release(0);
}
public void release(int flags)
{
synchronized (mToken) {
if (!mRefCounted || --mCount == 0) {
try {
mService.releaseWakeLock(mToken, flags);
} catch (RemoteException e) {
}
mHeld = false;
}
if (mCount < 0) {
throw new RuntimeException("WakeLock under-locked " + mTag);
}
}
}
報錯就抱在release(int flags)中,mCount為負數了,拋除了異常
我們再看下:setReferenceCounted(boolean flags);
public void setReferenceCounted(boolean value)
{
mRefCounted = value;
}
這個函數的作用是是不是需要計算鎖的數量,設置為false時,在release()的時候,不管你acquire()了多少回,可以releaseWakeLock掉
網上看到很多 acquire()后直接就調用release(),誤導大家
這個是我自己的一些看法,歡迎探討