Webview保存页面状态

Posted

技术标签:

【中文标题】Webview保存页面状态【英文标题】:Webview saving state of page 【发布时间】:2013-08-16 09:48:42 【问题描述】:

我正在使用的 webview 有一个小问题。我正在尝试使用 webview 来允许用户填写注册表单。当用户在一个会话中完成表单时,这可以正常工作,但如果用户锁定他们的手机,webview 活动就会被破坏。

我在内存中有两个活动,其中一个是内存密集型的。我相信我遇到的问题是,因为这个其他活动需要比 webview 更多的内存,所以 webview 被破坏了。

在某种程度上我对此表示满意,但我真的希望能够保存网页的当前状态,这样用户就不必再次提交所有详细信息。无论如何我可以做到这一点。

谢谢

【问题讨论】:

只有在锁定屏幕或旋转屏幕时才销毁活动? 可能重复***.com/questions/10258772/android-webview-savestate 我相信只是锁定,我遇到了方向问题,但在 android manifest 中修复了这个问题。 @lxx 会实际保存表单本身的状态,即当前写入表单的文本吗? 好的,当您按下主页按钮并重新打开应用程序时? 【参考方案1】:

试试看:- 您可以使用 WebView 方法 saveState()/restoreState() 并将其保存到活动 onRestore 包中,如果前一个活动将被销毁,则在 onCreate 方法中使用保存的值。 您可以使用此处描述的类似方法(但仅用于配置更改): http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/

【讨论】:

"请注意,此方法不再存储此 WebView 的显示数据。" developer.android.com/reference/android/webkit/…【参考方案2】:

我们遇到了类似的问题。我们有一个带有 webview 的活动。 我们希望用户在 web 视图中的表单上输入 3 个字段,然后启动一个新的活动(相机)来拍照。当我们取回图片时,我们使用 javascript 将图片插入到当前活动的 webview 表单中。这一切在 99.9% 的时间里都很好用。然而,在一些难以重现的奇怪场景中,当相机活动处于活动状态时,其背后的 webview 活动会被破坏。 saveState / restoreState 仅部分恢复 webview。启动相机时用户输入但未提交的 3 个表单字段现在丢失了。它们不会被 webview.saveState 保存。此外,页面上的一些 javascript 状态也丢失了。

为了解决这个问题,我们向页面添加了一个 javascript 方法,并在 saveInstanceState 上从应用程序调用它。然后在我们恢复状态后,我们在 webview 页面上调用另一个 javascript 方法来恢复状态。这是一种痛苦,但需要为您需要这样做的每种形式进行工作,但它确实有效。

我希望未来版本的 Android webview.saveState 将其保存为 Activity 被销毁之前的状态。或者,如果您将 Activity 标记为对您的应用至关重要,并且仅在您的应用不是用户正在使用的当前应用时才允许销毁该 Activity,那就太好了。

【讨论】:

【参考方案3】:

试试WebView.addJavascriptInterface,在Activity.onPause时,通过loadUrl("javascript:...")调用页面中的javascript方法,在网页中调用WebView.addJavascriptInterface提供的native方法保存数据。这是你想要的吗?

【讨论】:

也许可以,我必须调查一下才能确定它是否合适。【参考方案4】:

一个activity可以在按下返回键时被销毁;当屏幕旋转时(更快地破坏活动并重新创建所有图形元素);或者什么时候它可能在一段时间内不会激活(锁定手机、按 Home 键或启动其他应用程序)。

你需要这样做@Ixx 在他的评论中建议:Android webView saveState

用类似的东西保存应用程序的数据

@Override
public void onSaveInstanceState(Bundle outState)           
    super.onSaveInstanceState(outState);   
    /// save your things, e.g.
    outState.putString("name", name);

并且恢复,它存在于方法onCreate

@Override
public void onCreate(Bundle savedInstanceState)        
    super.onCreate(savedInstanceState);
    // if it is a new activity
    if (savedInstanceState == null) 
        // initialize vars, e.g.
        name = "Unknown";
    
    // if is a call after detroy the activity
    else 
        // recover vars, e.g.
        name = savedInstanceState.getString("name");
    

【讨论】:

那么在你说“保存你的东西”的地方,我是否需要专门检查文本字段或类似的内容并保存该数据,还是应该为我保存这些数据? 对不起,还有一个问题,我将如何访问文本字段中的数据? 之前 saveState() 可以用来保存 webview 的状态,但显然不再支持,也许 saveWebArchive() 可以工作。 也许我必须说 saveData “不再存储此 WebView 的显示数据。”

以上是关于Webview保存页面状态的主要内容,如果未能解决你的问题,请参考以下文章

在 Fragment 中保存状态 WebView

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

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

应用关闭时Android WebView保存显示状态

Android Fragment使用 Activity, Fragment, WebView的状态保存和恢复

Android WebView 与 Native 交互