相关的变量:

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(),误导大家

这个是我自己的一些看法,欢迎探讨

更多相关文章

  1. 在Activity里获取android屏幕方向并处理相关事件
  2. Android 横竖屏幕切换监听
  3. Android 实现调整屏幕亮度,以及自动适应
  4. Android获取状态栏、标题栏、ActionBar以及屏幕的高度
  5. Android屏幕及view的截图实例详解
  6. Android获取屏幕的高度和宽度
  7. 控件:拖动条 --- SeekBar(改变屏幕亮度)

随机推荐

  1. android 内存泄漏原因及解决方案
  2. Android(安卓)获取APK编译时间
  3. 【使用LeanCloud】在Android中添加一行数
  4. Android笔记之:onConfigurationChanged详
  5. hello,Android
  6. Android(安卓)Button按钮点击变换字体颜
  7. 一个Activity的显示过程总结(二)
  8. 【android studio】 gradle配置成本地离
  9. Android(安卓)studio安装与调试
  10. android源码学习之源码编译并nexus s真机