7

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

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

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

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

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

我正在启动相机Intent以获得结果。拍照后,应用程序恢复WebView活动,并应该使用 JavascriptLocalStorage使用一些数据变量更新 HTML5。

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

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

4

2 回答 2

8

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

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

我的应用程序.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效果很好。

于 2014-03-26T20:05:28.183 回答
3

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

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

这行:

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

在 javadoc 中为WebView.saveState(Bundle).

于 2013-07-09T08:44:59.717 回答