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

时间:2013-02-27 02:28:33

标签: javascript android variables webview savestate

我搜索了许多帖子但仍无法找到问题的答案。我正在处理使用Android的{​​{1}}应用。

我使用WebViewonSaveInstanceState()来保存onRestoreInstanceState()状态,如下所示:

WebView

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    webView.saveState(savedInstanceState);
}

我在@Override public void onRestoreInstanceState(Bundle savedInstanceState) { webView.restoreState(savedInstanceState); }

中也有这个
onCreate()

问题:似乎恢复public void onCreate(Bundle savedInstanceState) { ... other code ... if(savedInstanceState != null){ webView.saveState(savedInstanceState); }else{ webView.loadUrl("http://mypage"); } } 根本无法恢复WebView变量/ environment / workspace。当应用程序在后台被杀死然后恢复时,整个Javascript都随着所有对象/变量而消失。 javascript代码是名称间隔的,即Javascriptwindow.utilitiesPackwindow.eventHandlers等,并且它们未定义。此外,还使用window.automation和其他javascript插件:恢复状态后,所有这些插件似乎都未定义。基本上整个Javascript都没有恢复。

有人可以确认或反驳这是真的吗(Javascript没有保存)?如果没有保存整个Javascript工作区,那么JQuery究竟保存了什么?是否有一些简单/优雅的方法来使用现有的API来保存Javascript对象?

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

Update1:​​所以问题仍然存在。最重要的困难是:

我正在为结果启动相机WebView.saveState()。拍照时,应用会返回Intent活动,并且应该使用Javascript来更新带有一些数据变量的HTML5 WebView

显示Camera Activity时,LocalStorage的主要活动被杀死,所以当我们回到WebView时,不再有Javascript,也没有我可以从Android代码调用的函数。这种情况每次都发生在WebView上。它仍然发生在其他手机上,但不是每次都拍照。

不知道该怎么做。不知何故,我必须使用WebView制作主Activity,以便在使用Camera Intent拍摄照片时保持状态。有谁知道如何实现这一目标?

2 个答案:

答案 0 :(得分:8)

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

我已扩展我的应用程序以管理我的网页浏览...

MyApplication.java:

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;
  }
}

在我们的活动中:

@Override protected void onCreate(Bundle savedInstanceState) {
  // ...
  MyApplication app = (MyApplication) getApplication();
  mWebView = app.getWebView();
  if (!app.isWebViewInitialized()) { 
    /* first time initialization */ 
    app.setWebViewInitialized(true);
  }
}

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

答案 1 :(得分:3)

找到的信息很少,只有这一行:

  

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

和这一行:

  

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

WebView.saveState(Bundle)的javadoc中。