如何在 activity 销毁过程中保留 Web 视图的显示状态?

How do I preserve a web view's display state across activity destruction?

我正在制作一个 Android 应用程序,它是一个嵌入到网络视图中的复杂 java 脚本应用程序。每次主要 activity 被破坏时(即由于旋转、后退按钮按下等),Web 视图都会刷新。

为了保留网页的状态,我要覆盖 onSaveInstanceStateonRestoreInstanceState:

  @Override
  protected void onSaveInstanceState(Bundle outState)
  {
    super.onSaveInstanceState(outState);

    // Save the state of the WebView
    webView.saveState(outState);
  }

  @Override
  protected void onRestoreInstanceState(Bundle savedInstanceState)
  {
    super.onRestoreInstanceState(savedInstanceState);

    // Restore the state of the WebView
    webView.restoreState(savedInstanceState);
  }

这阻止了刷新,但未能保留网页的显示状态,这对我来说很重要,因为用户在我存储在显示状态下的复杂 js 应用程序中丢失了工作。

然后我尝试通过覆盖 onConfigurationChanged 来手动处理配置更改。此方法保留了旋转和其他配置更改的状态,但是当用户按下 Android 后退按钮(这会破坏 activity)时,显示状态全部丢失。

我现在正在考虑将 Web 视图存储在为 onCreate 捆绑包中保留的片段上,但我不确定这是否会保留显示状态。

我也在考虑重写 onDestroy 以在 Web 视图中查询 java 脚本以获取当前应用程序状态(比如以某种 Blob 或 json 格式),然后将其存储在包中(甚至在本地 SQLite blob 中),但我找不到用于在 Android 中轮询 java 脚本状态的同步方法。我可以将一个 java 对象发送到 java 脚本中,该脚本使用 Android 的 addJavascriptInterface 方法维护应用程序的状态,但是计算网络应用程序的状态需要一个很多工作 - 我不想在网络应用程序中使用计时器定期轮询状态。

关于如何在 activity 销毁过程中保留 Web 视图的显示状态(如动态创建的任何 DOM 元素或文本输入)的任何想法?或者如何记住显示状态以便以后重新构建?

我觉得这对于那些基本上想要制作 Android 由 java 嵌入 Web 视图中的脚本集中支持的应用程序的开发人员来说是一个障碍。

您只需要将 WebView 中的代码视为 Web 应用程序,并使用 storage features provided by HTML. Make sure to enable them via WebSettings though (use this and this 设置)。或者,使用通过注入的 Java 对象公开的类似功能,这样您可以轻松修改 Java 代码中存储的数据。

DOM和JS的状态其实很复杂,可能涉及到网络连接(通过XHR和WebSockets),所以试图将其保存为转储是徒劳的。