如何在Android Lollipop中保存WebView状态并将其恢复?

时间:2015-01-22 19:08:08

标签: android webview android-webview

这个问题被多次询问,并且它有过常用的答案。最近在文档中说,他们出于安全原因删除了此功能。对于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-我试图将我的超时活动显示为一个对话框,如果我在没有评估凭据的情况下解除它,但是如果我评估并关闭对话框则会重新创建webView。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

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

然后,如果通过您的应用程序,您需要完全重新创建实例以刷新webView,您可以使用finish();如果它在活动内部,或者如果您正在进行其他活动,并且想要重新创建webView活动,请阅读this link来执行此活动。

答案 1 :(得分:0)

如果纵向和横向视图的布局没有差异,请在清单中为“活动”设置android:configChanges="orientation|screenSize",以保留其中包含Webview的活动状态。

您可以将Webview状态另存为:

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

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

仅在保存状态不为null时重新加载,例如:

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