如何防止 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黑屏的问题