Webview保存页面状态

时间:2013-08-16 09:48:43

标签: android webview

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

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

我在某种程度上对此很好,但我真的希望能够保存网页的当前状态,这样用户就不必再次提交所有细节了。无论如何我能做到这一点。

由于

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

要解决此问题,我们在页面中添加了一个javascript方法,并在saveInstanceState上从应用程序调用它。然后在我们恢复状态之后,我们在webview页面上调用另一个javascript方法来恢复状态。这是一个痛苦,但需要为你需要做的每一种形式的工作,但它的工作原理。

我希望Android webview.saveState的未来版本能够像活动被销毁之前一样保存它。或者,如果您将某个活动标记为对您的应用程序至关重要,并且仅在您的应用不是用户正在使用的当前应用时才允许销毁该活动,那就太棒了。

答案 2 :(得分:1)

尝试WebView.addJavascriptInterface,当Activity.onPause,通过loadUrl(“javascript:...”)调用页面中的javascript方法,并在网页中调用WebView.addJavascriptInterface提供的本机方法来保存数据。这就是你想要的吗?

答案 3 :(得分:0)

按下后退键时可以销毁活动;当屏幕旋转时(更快地破坏活动并重新创建所有图形元素);或者什么时候它可以在一段时间内不活动(锁定手机,按主页键或其他应用程序启动)。

你需要在他的评论中提出@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");
    }
}