在onDestroy()中调用finish()是否有意义?

时间:2014-06-13 02:38:28

标签: android cordova

我尝试使用我们的应用调试问题。我们的应用程序正在使用一个框架(Phonegap),它基本上做了以下奇怪的事情:

@Override
public void onDestroy()
{
  super.onDestroy();

  finish();
}

这对我来说似乎不对,但我不是Android编程方面的专家。根据我对活动生命周期的理解,onDestroy通常是调用finish()的结果,但从不相反。

澄清一下,onDestroy首先被调用的唯一原因是因为事实上已经被先前调用finish()拆除了。在onDestroy中再次调用finish()是否正确?

6 个答案:

答案 0 :(得分:3)

一般来说,调用finish()会在某个地方触发对onDestroy()的调用,但不能保证。

您的应用程序流程可能会在调用finish()和调用onDestroy()之间终止,或者电池可能耗尽等等。

因此,正如文档中所述,调用finish()通常会导致onDestroy(),您无需在onDestroy()内调用它。

您还可以使用isFinishing()来确定活动是否已在完成过程中。

答案 1 :(得分:1)

这是正确的。那里finish()是完全没必要的。活动已经被拆除。

另一方面,我认为这不会引起问题。该框架对于finish()调用非常宽松(我曾经在同一个活动中有两个,我几个月没有发现它)。 :)

再往后一步,你怀疑你遇到的另一个问题可能与此有关吗?

答案 2 :(得分:1)

您仍然可以在onDestroy()中呼叫Activity,但覆盖onDestroy方法的方式会导致异常SuperNotCalledException。那是因为你不能在不调用super.onDestroy();的情况下销毁Activity。

Button b = (Button) findViewById(R.id.button1);
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            MainActivity.this.onDestroy();//calling the onDestroy()
        }
    });

<强>问题:

@Override
public void onDestroy()
{
  finish(); //will finish but will catch an exception "SuperNotCalledException"
}

@matiash

我这样做的方式

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.d("I am called", "I am called");
    finish();

}

此实现可以正常工作,但只有在您添加super.onDestroy();

时才会有效

答案 3 :(得分:1)

OnDestroy将在配置更改或活动重新启动时调用(由于调用重新创建),因此在某些情况下调用finish()会有意义。

答案 4 :(得分:0)

onPause()isFinishing(),它会在onPause中知道活动是否完成

答案 5 :(得分:0)

你最好在 onDestroy()之前清理,因为根本不可能完全调用onDestroy()。来自onDestroy()的文档:

  

注意:不要指望将此方法称为保存地点   数据!例如,如果活动正在编辑内容中的数据   提供者,这些编辑应该在onPause()或   onSaveInstanceState(Bundle),不在这里。这种方法通常是   实现释放资源,如与线程相关联的线程   活动,以便被破坏的活动不会留下这样的东西   当其余的应用程序仍在运行时。有   系统将简单地杀死活动的托管的情况   进程中没有调用此方法(或任何其他方法),所以它   不应该被用来做那些打算留下来的东西   过程消失后。

作为OP及其他人在此发布的附注,您应该查看Android生命周期并阅读生命周期回调的API文档。显然,对SO的生命周期方法有很多模糊的理解,因为这些线程不断涌现。