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



我正在制作一个Android应用程序,它是一个嵌入在web视图中的复杂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应用程序中的工作。

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

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

我也在考虑覆盖onDestroy,在web视图中查询当前应用程序状态的javascript(比如以某种Blob或json格式),然后将其存储在捆绑包中(甚至存储在本地SQLite Blob中),但我在Android中找不到轮询javascript状态的同步方法。我可以通过Android的addJavascriptInterface方法将一个java对象发送到javascript中,该javascript可以维护应用程序的状态,但计算web应用程序的状况需要大量工作——我不想在web应用程序中使用计时器定期轮询状态。

关于如何在活动破坏期间保持web视图的显示状态(如动态创建的任何DOM元素或文本输入),有什么想法吗?或者如何记住显示状态以便以后重新构建?

我觉得这对那些基本上想让安卓应用程序由嵌入在web视图中的javascript集中驱动的开发人员来说是一个障碍。

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

事实上,DOM和JS的状态非常复杂,并且可能涉及网络连接(通过XHR和WebSockets),所以尝试将其保存为转储是徒劳的。

最新更新