如何在活动销毁期间保留Web视图的显示状态?

时间:2015-06-25 08:42:16

标签: android android-activity android-webview

我正在制作一个Android应用,这是一个嵌入在网络视图中的复杂JavaScript应用。每次主要活动被破坏时(即由于旋转,按下后退按钮等),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 app中失去工作。

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

我现在正在考虑将web视图存储在onCreate包中保留的片段中,但我不确定是否保留了显示状态。

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

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

我觉得这对于那些基本上希望通过嵌入在网络视图中的javascript集中支持Android应用程序的开发人员来说是一个障碍。

1 个答案:

答案 0 :(得分:3)

您只需要将WebView中的代码视为Web应用程序,并使用storage features provided by HTML。确保通过WebSettings启用它们(使用thisthis设置)。或者,使用通过注入的Java对象公开的类似功能,这样您就可以轻松地修改Java代码中的存储数据。

DOM和JS的状态实际上非常复杂,并且可能涉及网络连接(通过XHR和WebSockets),因此尝试将其保存为转储是一种失败的努力。