我尝试使用我们的应用调试问题。我们的应用程序正在使用一个框架(Phonegap),它基本上做了以下奇怪的事情:
@Override
public void onDestroy()
{
super.onDestroy();
finish();
}
这对我来说似乎不对,但我不是Android编程方面的专家。根据我对活动生命周期的理解,onDestroy
通常是调用finish()
的结果,但从不相反。
澄清一下,onDestroy
首先被调用的唯一原因是因为事实上已经被先前调用finish()
拆除了。在onDestroy中再次调用finish()
是否正确?
答案 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的生命周期方法有很多模糊的理解,因为这些线程不断涌现。