如何在 Android Lollipop 中保存 WebView 状态并恢复它?
Posted
技术标签:
【中文标题】如何在 Android Lollipop 中保存 WebView 状态并恢复它?【英文标题】:How to save WebView state and restore it in Android Lollipop? 【发布时间】:2015-03-21 17:13:01 【问题描述】:这个问题被问了很多次,并且它的答案曾经有效。最近在文档中说,出于安全原因,他们已删除此功能。 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。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:我终于找到了解决方案。无法保存 WebView 的状态并拥有所有内容,因此我们需要防止重新加载或重新创建 webView。为了让我们的活动实例包含 webView,我们应该将以下代码添加到我们的清单文件中:
<activity ...
android:launchMode="singleInstance"
android:alwaysRetainTaskState="true">
然后,如果您需要通过您的应用程序完全重新创建实例以刷新 webView,您可以使用 finish();如果它在 Activity 内部,或者如果您在另一个 Activity 中并且您想要重新创建您的 webView Activity,请阅读this link 来执行此操作。
【讨论】:
【参考方案2】:在 Manifest 中为 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")
【讨论】:
以上是关于如何在 Android Lollipop 中保存 WebView 状态并恢复它?的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio - 如何在 webview Lollipop 中上传文件 (Android 5.0)
应用程序如何检测状态栏颜色(Android 5.0 Lollipop)?
如何以编程方式在 Lollipop Android 中打开 FlashLight
如何使用 OS Lollipop 在 Java 中为 Android 裁剪图像
如何在带有 Android 5.0 Lollipop 的代码(不是 xml)中以编程方式使用 RippleDrawable?