【问题标题】:How to prevent call of onDestroy() after onPause()?如何防止 onPause() 之后调用 onDestroy()?
【发布时间】: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;

【问题讨论】:

    标签: android android-webview android-activity android-websettings


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      【解决方案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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-08
              • 1970-01-01
              • 1970-01-01
              • 2014-06-24
              • 2011-03-03
              • 1970-01-01
              相关资源
              最近更新 更多