如何防止 onPause() 之后调用 onDestroy()?

Posted

技术标签:

【中文标题】如何防止 onPause() 之后调用 onDestroy()?【英文标题】:How to prevent call of onDestroy() after onPause()? 【发布时间】:2012-01-23 08:13:28 【问题描述】:

在我的 android 应用程序中,我注意到在按下返回键时,在 onPause() 自动之后,onDestroy() 会被调用。

如何防止应用在 onPause() 之后调用 onDestroy()?

我不想在按下后退键后销毁实例。

按下返回键后,我的 webview 对象被破坏了。所以,一旦我按下返回键,我就无法再次访问 webview。

我有两个网址。将它们想象为 URL1 和 URL2。

当我在 webview 中启动 URL1 并按返回键时,流程是 onKeyDown() -> onPause()

当我在 webview 中启动 URL2 并按返回键时,流程是 onKeyDown() -> onPause() -> onDestroy()

为什么会有不同的行为?和cookie有关系吗?

对于 URL1——cookies.isSecure=true;

对于 URL2——cookies.isSecure=false;

【问题讨论】:

【参考方案1】:

检查您在 Manifest 中的活动声明。以最小化时可以存储数据的方式声明它。

Activity 应该具有恢复内容的能力。

【讨论】:

【参考方案2】:

这就是 Activity 生命周期在 Android 中的设计方式,您不应干预它。无论您是否愿意,您的应用程序都可能在任何时间点被运行时销毁:) 因此,更好的方法是在您的应用程序逻辑中适应生命周期。

【讨论】:

但这并不总是发生。有时它调用,有时它不调用。所以无法决定行为。 行为在文档developer.android.com/reference/android/app/Activity.html中定义 我认为一种方法是以某种方式将您的活动带到前台。【参考方案3】:

你可以覆盖 finish() 来避免这种情况:

@Override
public void finish() 
    //super.finish(); // do not call super
    moveTaskToBack(true); // move back

【讨论】:

【参考方案4】:

你可以在你的活动中覆盖onBackPressed(),但这应该是最后的手段,

在开始之前了解这些链接

activity lifecycle

developer blog

【讨论】:

【参考方案5】:

正常的 android 应用程序行为表明 Home 按钮将应用程序隐藏到后台(您将看到主屏幕),并且 Back 按钮完成应用程序(按此顺序通过 onPause、onStop、onDestroy)。

如果您想在按下后退按钮时保留应用程序的实例/状态,我建议您在 onPause 中进行保存 - 将状态保存在 SharedPreferences 或您的 sqlite 数据库中的某个位置。但请注意,保存过程应尽可能快,因为您的应用程序将等到 onPause 完全执行后再退出。

然后在 onResume 中加载您的实例/状态。

【讨论】:

确切地说,在我的应用程序中发生的事情是 onPause 和 onDestroy Webview 对象正在被破坏。但我希望它即使在单击后退按钮后仍然存在。因此,为下一次遍历存储 webview 对象变得很困难。 有一个名为 moveTaskToBack(true) 的方法,它模仿主页按钮的功能。您可以在 onBackPressed() 方法中使用它来隐藏您的应用程序,而无需调用 onDestroy。 非常感谢约瑟夫斯。这样我就可以将 webview 推到后面。但它完全关闭了应用程序。无论如何我可以在此方法调用后给出启动哪个屏幕?我试过 startactivity() 但它再次调用 onPause() 和 onDestroy()。 尝试在 moveTaskToBack 之前调用 startActivity(intent)。或者您可以将 moveTaskToBack 放在 onPause 中。调用startActivity会自动触发当前activity的onPause 在这种情况下,过于完整的应用程序将被最小化,而不仅仅是 webview 活动。如果只将webview最小化并且应用程序之前的屏幕完好无损,那就太好了。【参考方案6】:

您可以知道onDestroy() 将在onPause() 之后使用isFinishing() 调用,因此您可以避免一些代码。

【讨论】:

【参考方案7】:

这里的答案指定我们必须以不被破坏的方式配置清单,但它没有回答如何配置。当我遇到类似问题时,我到达了这篇文章,解决方案非常简单。顺便提一下

android:persistent="true"

参考:-https://developer.android.com/guide/topics/manifest/application-element.html

这应该可以防止您的活动在您单击后退按钮时被破坏

我在另一篇文章中用一个用例详细解释过,

Prevent activity from being destroyed as long as possible

我希望这可以帮助其他遇到同样问题的人

【讨论】:

以上是关于如何防止 onPause() 之后调用 onDestroy()?的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅解决关于在OpenGL ES开发中GLSurfaceView调用了onPause和onResume方法,然后息屏亮屏之后GLSurfaceView黑屏的问题

我的OpenGL学习进阶之旅解决关于在OpenGL ES开发中GLSurfaceView调用了onPause和onResume方法,然后息屏亮屏之后GLSurfaceView黑屏的问题

防止新意图或切换应用程序破坏活动

Android的Fragment知识点

Fragment 与 Parcel 一起崩溃:调用 onPause 方法时无法编组值错误

为啥水平应用程序在 onPause() 之后创建垂直活动