如何在 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?

如何使用为 Android 5.0 (Lollipop) 提供的新 SD 卡访问 API?