我创建了一个使用相机的应用程序,在应用程序执行期间,屏幕始终处于打开状态。
在onCreate()方法中,我添加了锁:
final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
this.mWakeLock.acquire();
这是覆盖onStop()方法:
@Override
protected void onStop() {
if(mWakeLock.isHeld())
{
mWakeLock.release();
}
super.onStop();
}
但是在应用程序终止后,屏幕一直处于打开状态,如果我运行相机应用程序,它会遇到一个错误,这个错误很明显,因为没有释放相机资源。
有没有人知道如何在申请终止时释放所有资源?
答案 0 :(得分:13)
我会将锁从OnCreate()
移到OnResume()
。您希望在活动的可见生命周期内锁定,而不是活动的整个生命周期。你的活动肯定会在其前面运行的另一个Activity上运行。
我会将版本移至OnPause()
。 OnPause()
是您的应用程序通常应被操作系统杀死的最早点。
另外,在发布之前我不会检查是否有锁。如果您使用OnResume()
获取锁定; isHeld
中的OnPause()
应始终为真。
答案 1 :(得分:3)
听起来好像你的应用程序永远不会在Wakelock
上调用发布 - 它是否有可能在onStop
或onPause
之前抛出异常?我会在你调用release时包含一些日志记录,以确认它正在被执行。
无论如何,您肯定希望将acquire
和release
方法分别移至onResume
和onPause
。您获得的代码只会在您的应用程序第一次启动时获取WakeLock。
感谢Android的后台处理,您的代码存在潜在的不平衡。如果用户按下主页键来切换应用程序,则锁定将被释放。如果他们切换回你的应用程序onCreate将不会被调用,所以永远不会获得锁定。
你最好的办法是在onCreate中构建WakeLock(就像你一样),获取onResume中的锁并在onPause中释放它(包括对isHeld的调用)。这将保证只要您的应用程序位于前台,就会保持锁定。
答案 2 :(得分:3)
我使用mWakelock.setReferenceCounted(false),仍然不知道这意味着什么,但它解决了我的“Wakelock欠锁定”问题。
Init:OnStart() 获取:onResume() 发布:onStop()
答案 3 :(得分:2)
我在使用OpenGL时发布数据时遇到了麻烦。所以现在,用android.os.Process.killProcess(android.os.Process.myPid());它就像我想要的那样工作!!
感谢艺术
答案 4 :(得分:1)
你在哪里叫完()?
您应该在onPause而不是onStop上释放资源。无法保证在您的活动被杀之前始终会调用onStop。如果系统需要资源,那么它可能会在调用onStop之前终止活动。
在您认为应用程序被终止时,尝试放置调试日志并跟踪执行路径。