【发布时间】:2011-05-07 11:42:12
【问题描述】:
pm 和 keepScreenOn 变量是全局定义的。
我在 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 在仍被持有时完成:tpd
跟踪显示我在退出前释放了锁。 我错过了什么?
如果不通过至少一个,就无法退出应用程序
onPause、onStop 或 onDestroy。我可以看到该应用程序调用了
release() 经常调用 acquire() 所以即使
唤醒锁是引用计数的,它仍然应该有零引用。
【问题讨论】:
-
可能和你的问题无关,但是为什么你在这么多地方创建和释放锁?为什么不只在 onResume 和 onPause 时这样做?
-
我试过了。然后我跟踪了每个 onXXX 例程。然后我添加了它
-
你的
keepScreenOn变量在一个类中只声明一次吗?是否还有其他一些范围较小的声明(即在方法中声明)。 -
我倾向于使用
WakeLock.acquire(5000),其中 5,000 是超时,或者您希望的另一个超时。这种方法似乎一直有效。而没有超时的WakeLock.acquire()会意外地导致WakeLock 在仍被持有时完成。这是一个碰巧的事情。如果您不想编写自己的 WakeLock 实现,请查看 CommonsWare 的 WakeLock library。还不错。
标签: android android-activity wakelock