如何在 Android Lollipop 中保存和恢复 WebView 状态?

How to save WebView state and restore it in Android Lollipop?

这个问题被问过多次,它的答案曾经有效。最近在文档中说,出于安全原因,他们已删除此功能。对于 webView 状态,只能恢复一些有限的东西。我已经尝试了多种方法来做到这一点,但每次它刷新 webView 状态并且它不显示 webView 内容。

我想做什么?

我有一个网络应用程序,我想在超时后检索用户内容(如果他们输入的凭据正确)。



到目前为止我做了什么?

1- 我已经尝试了所有解决方案,包括以下方法:

@Override
protected void onSaveInstanceState(Bundle outState) {
    webView.saveState(outState);
}
@Override
public void onCreate(final Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.blah);
   WebView webview = (WebView)findViewById(R.id.webview);
   if (savedInstanceState != null)
      webview.restoreState(savedInstanceState);
   else
      webview.loadUrl(URLData)
}

还有清单文件

android:configChanges="keyboardHidden|orientation|screenSize|screenLayout|uiMode|screenSize|smallestScreenSize"

2- 我试图将我的超时 activity 显示为一个对话框,如果我只是在不评估凭据的情况下关闭它,它就会工作,但如果我评估并关闭该对话框,它会重新创建 webView。

如有任何帮助,我们将不胜感激。

终于找到解决办法了。无法保存 WebView 的状态并拥有所有内容,因此我们需要防止重新加载或重新创建 webView。为了让我们的 activity 实例包含 webView,我们应该将以下代码添加到我们的清单文件中:

<activity ...
        android:launchMode="singleInstance"
        android:alwaysRetainTaskState="true">

然后如果您需要通过您的应用程序完全重新创建实例以刷新 webView,您可以使用 finish();如果它在 activity 中,或者如果你在另一个 activity 中并且你想重新创建你的 webView activity,请阅读 this link 来完成它。

在清单中为 Activity 设置 android:configChanges="orientation|screenSize" 以保留其中包含 Webview 的 activity 的状态,前提是纵向和横向视图的布局没有差异。

您可以将 Webview 状态保存为:

override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) webView.saveState(outState) 
} 

override fun onRestoreInstanceState(savedInstanceState: Bundle?) { super.onRestoreInstanceState(savedInstanceState) webView.restoreState(savedInstanceState) 
}

仅当保存的状态不为空时才重新加载,如:

if (savedInstanceState == null) {
    webView.loadUrl("replace_with_your_url")
}