Android:如何在应用程序终止时释放资源?

时间:2009-07-01 09:12:08

标签: android resources

我创建了一个使用相机的应用程序,在应用程序执行期间,屏幕始终处于打开状态。

在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();
}

但是在应用程序终止后,屏幕一直处于打开状态,如果我运行相机应用程序,它会遇到一个错误,这个错误很明显,因为没有释放相机资源。

有没有人知道如何在申请终止时释放所有资源?

5 个答案:

答案 0 :(得分:13)

我会将锁从OnCreate()移到OnResume()。您希望在活动的可见生命周期内锁定,而不是活动的整个生命周期。你的活动肯定会在其前面运行的另一个Activity上运行。

我会将版本移至OnPause()OnPause()是您的应用程序通常应被操作系统杀死的最早点。

另外,在发布之前我不会检查是否有锁。如果您使用OnResume()获取锁定; isHeld中的OnPause()应始终为真。

答案 1 :(得分:3)

听起来好像你的应用程序永远不会在Wakelock上调用发布 - 它是否有可能在onStoponPause之前抛出异常?我会在你调用release时包含一些日志记录,以确认它正在被执行。

无论如何,您肯定希望将acquirerelease方法分别移至onResumeonPause。您获得的代码只会在您的应用程序第一次启动时获取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之前终止活动。

在您认为应用程序被终止时,尝试放置调试日志并跟踪执行路径。