android - WakeLock 在仍然举行的情况下完成

标签 android android-activity wakelock

pmkeepScreenOn 变量是全局定义的。

我在 OnCreate 方法中获取 PowerManager.WakeLock:

pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
keepScreenOn = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_LOCK,"tpd");

在我的 onStart、onResume 和 onRestart 中,我使用了锁

if (keepScreenOn == null) {
    keepScreenOn = pm.newakeLock(PowerManager,SCREEN_BRIGHT_LOCK,"tpd");
}
keepScreenOn.acquire();

在我的 onDestroy、onPause 和 onStop 中,我通过以下方式释放锁:

if (keepScreenOn != null) {
  keepScreenOn.release();
  keepScreenOn = null
}

在我的应用退出后,我得到一个失败屏幕并且 adb 提示

java.lang.Exception: WakeLock finalized while still held: tpd

跟踪显示我在退出前释放了锁。 我错过了什么?

如果不通过至少一项,就无法退出应用程序 onPauseonStoponDestroy。我可以看到该应用程序调用了 release() 和调用 acquire() 一样频繁,所以即使 唤醒锁是引用计数的,它仍然应该有零引用。

最佳答案

好的,我相信我找到了问题。

WakeLock 是引用计数的。这意味着如果第二个 acquire() 发生它只会增加引用计数。每次调用 acquire() 需要通过调用 isHeld() 来保护,如下所示:

if ((keepScreenOn != null) &&           // we have a WakeLock
    (keepScreenOn.isHeld() == false)) {  // but we don't hold it 
  keepScreenOn.acquire();
}

我以为我持有的锁上的 acquire() 什么也没做 多个 acquire() 调用导致了问题。由于引用 count 不为零时 GC 会抛出错误。

关于android - WakeLock 在仍然举行的情况下完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5920798/

相关文章:

android - 如何直接从screencap.cpp中获取像素数据

android - 为结果启动 Activity

java - 将数据发送到父 Activity

java - 更改 fragment 时应用程序崩溃

java - 具有部分唤醒锁的后台重复线程的android服务

android - 唤醒 Android 手机/平板电脑?

java - 成功将元素解析到列表后,SAX 解析器 endDocument 中的空列表

输入时Android浏览器不使用字体系列

Android Proximity 警报未触发

基于 Android 的 SMS 服务器和 WakeLock?