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

use*_*581 7 javascript variables android savestate webview

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

我使用onSaveInstanceState()onRestoreInstanceState()保存这样的WebView状态:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    webView.saveState(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    webView.restoreState(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)

我也有这个onCreate():

public void onCreate(Bundle savedInstanceState) {
    ... other code ...
    if(savedInstanceState != null){
        webView.saveState(savedInstanceState);
    }else{
        webView.loadUrl("http://mypage");
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:似乎恢复WebView根本不会恢复Javascript变量/ environment/workspace.当应用程序在后台被杀死然后恢复时,整个Javascript都随着所有对象/变量而消失.JavaScript代码是名称间隔,即window.utilitiesPack,window.eventHandlers,window.automation等和它们是不确定的.此外JQuery,还使用了其他javascript插件:恢复状态后,所有这些插件似乎都未定义.基本上整个Javascript都没有恢复.

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

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

Update1:问题仍然存在.最重要的困难是:

我正在推出一个相机Intent的结果.当拍照时,应用程序返回WebView活动,并且应该使用Javascript来更新HTML5 LocalStorage和一些数据变量.

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

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

小智 8

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

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

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

在我们的活动中:

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

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

  • 这只是部分解决方案,因为Android OS有权在另一个应用程序(例如相机应用程序)中完全终止您的应用程序进程,因此在应用程序实例上保存webview状态将无法解决此问题.例如,当系统资源较低时,可能会发生这种情况. (3认同)

diy*_*ism 3

查到的资料很少,只有这一行:

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

和这一行:

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

在 javadoc 中WebView.saveState(Bundle).