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

2023-11-26

我搜索了很多主题,但仍然找不到我的问题的答案。我正在研究一个Android应用程序使用WebView.

I use onSaveInstanceState() and onRestoreInstanceState()来保存WebView像这样声明:

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

and

@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不恢复Javascript变量/环境/工作空间。当应用程序在后台被杀死然后恢复时,整个 Javascript 以及所有对象/变量都消失了。 javascript 代码是命名空间的,即window.utilitiesPack, window.eventHandlers, window.automation等,它们是未定义的。还JQuery和其他javascript插件被使用:所有这些插件在恢复状态后似乎都是未定义的。基本上整个Javascript都没有恢复。

有人可以确认或反驳这就是它的真实情况(Javascript 未保存)吗?如果整个 Javascript 工作区没有保存,那么究竟会发生什么WebView.saveState()节省?有没有一些简单/优雅的方法来使用现有的 API 来保存 Javascript 对象?

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

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

我正在启动相机Intent为了一个结果。拍照后,应用程序返回WebViewActivity 并应该使用 Javascript 来更新 HTML5LocalStorage与一些数据变量。

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

不知道在这里做什么。不知何故,我必须使用 WebView 来创建主 Activity,以在使用相机意图拍摄照片时保留状态。有谁知道如何实现这一点?


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

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

我的应用程序.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);
  }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebView saveState() 是否保留 Javascript 变量/环境? 的相关文章

随机推荐