如何在 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")
}
这个问题被问过多次,它的答案曾经有效。最近在文档中说,出于安全原因,他们已删除此功能。对于 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")
}