首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebView saveState()是否保存Javascript变量/环境?

WebView saveState()是否保存Javascript变量/环境?
EN

Stack Overflow用户
提问于 2013-02-27 02:28:33
回答 2查看 3.9K关注 0票数 7

我搜索了很多线索,仍然找不到我问题的答案。我正在开发一个Android应用程序,它使用WebView

我使用onSaveInstanceState()onRestoreInstanceState()来保存WebView状态如下:

代码语言:javascript
复制
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    webView.saveState(savedInstanceState);
}

代码语言:javascript
复制
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    webView.restoreState(savedInstanceState);
}

我的onCreate()里也有这个

代码语言:javascript
复制
public void onCreate(Bundle savedInstanceState) {
    ... other code ...
    if(savedInstanceState != null){
        webView.saveState(savedInstanceState);
    }else{
        webView.loadUrl("http://mypage");
    }
}

问题:,恢复WebView似乎根本不恢复Javascript变量/环境/工作区。当应用程序在后台被杀死,然后恢复时,整个Javascript就会与所有的对象/变量一起消失。javascript代码是名称分隔的,即window.utilitiesPackwindow.eventHandlerswindow.automation等,而且它们是未定义的。此外,还使用了JQuery和其他javascript插件:在恢复状态之后,所有这些插件似乎都没有定义。基本上整个Javascript没有恢复。

有人能证实或否认这是真的(Javascript没有保存)吗?如果没有保存整个Javascript工作区,那么WebView.saveState()到底保存了什么?是否有一些简单/优雅的方法来使用现有的API来保存Javascript对象?

//======================================================

Update1:,所以问题仍然存在。最大的困难是:

我正在启动一个相机Intent作为一个结果。拍照时,app返回到WebView活动,并使用Javascript更新HTML5 LocalStorage中的一些数据变量。

当显示相机活动时,WebView的主要活动就会被杀死,所以当我们回到WebView时,就没有Javascript了,也没有我可以从安卓代码调用的函数了。这种情况每次都发生在Galaxy S3上。这种情况仍然发生在其他手机上,但不是每次拍照时都会发生。

我不知道该怎么做。不知怎么的,我必须用WebView做主要的活动,以保留状态,而照片是用相机的意图拍摄的。有没有人知道如何做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-09 08:44:59

发现的信息很少,只有这一行:

请注意,此方法不再存储此WebView的显示数据。如果从未调用restoreState(Bundle),以前的行为可能会泄漏文件。

这一行:

返回用于保存状态的后退/转发列表的相同副本。

WebView.saveState(Bundle)的javadoc中。

票数 3
EN

Stack Overflow用户

发布于 2014-03-26 20:05:28

正如user2113581所评论的,将WebView移动到应用程序的上下文而不是活动是一个潜在的解决方案。这仍然存在user2113581提到的所有缺陷,包括<select>无法工作(因为它创建了一个窗口,但是应用程序上下文没有窗口令牌)。

我已经扩展了我的应用程序来管理我的网页.

MyApplication.java:

代码语言:javascript
复制
public class MyApplication extends Application {
  private WebView mWebView;
  private boolean mWebViewInitialized;
  // ...

  @Override public void onCreate() {
    super.onCreate();
    mWebView = new WebView(this);
    mWebViewInitialized = false; // we do some initialization once in our activity.
  }

  public WebView getWebView() { return mWebView; }
  public boolean isWebViewInitialized() { return mWebViewInitialized; }
  public void setWebViewInitialized(boolean initialized) {
    mWebViewInitialized = initialized;
  }
}

在我们的活动中:

代码语言:javascript
复制
@Override protected void onCreate(Bundle savedInstanceState) {
  // ...
  MyApplication app = (MyApplication) getApplication();
  mWebView = app.getWebView();
  if (!app.isWebViewInitialized()) { 
    /* first time initialization */ 
    app.setWebViewInitialized(true);
  }
}

最后,在您的活动中,您将希望在有意义的生命周期事件期间将mWebView添加到容器视图(FrameLayout或类似视图)。当活动暂停或停止时,您需要从容器中删除它。我使用了onResumeonPause,取得了很好的效果。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15103141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档