我搜索了很多线索,仍然找不到我问题的答案。我正在开发一个Android应用程序,它使用WebView。
我使用onSaveInstanceState()和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似乎根本不恢复Javascript变量/环境/工作区。当应用程序在后台被杀死,然后恢复时,整个Javascript就会与所有的对象/变量一起消失。javascript代码是名称分隔的,即window.utilitiesPack、window.eventHandlers、window.automation等,而且它们是未定义的。此外,还使用了JQuery和其他javascript插件:在恢复状态之后,所有这些插件似乎都没有定义。基本上整个Javascript没有恢复。
有人能证实或否认这是真的(Javascript没有保存)吗?如果没有保存整个Javascript工作区,那么WebView.saveState()到底保存了什么?是否有一些简单/优雅的方法来使用现有的API来保存Javascript对象?
//======================================================
Update1:,所以问题仍然存在。最大的困难是:
我正在启动一个相机Intent作为一个结果。拍照时,app返回到WebView活动,并使用Javascript更新HTML5 LocalStorage中的一些数据变量。
当显示相机活动时,WebView的主要活动就会被杀死,所以当我们回到WebView时,就没有Javascript了,也没有我可以从安卓代码调用的函数了。这种情况每次都发生在Galaxy S3上。这种情况仍然发生在其他手机上,但不是每次拍照时都会发生。
我不知道该怎么做。不知怎么的,我必须用WebView做主要的活动,以保留状态,而照片是用相机的意图拍摄的。有没有人知道如何做到这一点?
发布于 2013-07-09 08:44:59
发现的信息很少,只有这一行:
请注意,此方法不再存储此WebView的显示数据。如果从未调用restoreState(Bundle),以前的行为可能会泄漏文件。
这一行:
返回用于保存状态的后退/转发列表的相同副本。
在WebView.saveState(Bundle)的javadoc中。
发布于 2014-03-26 20:05:28
正如user2113581所评论的,将WebView移动到应用程序的上下文而不是活动是一个潜在的解决方案。这仍然存在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);
}
}最后,在您的活动中,您将希望在有意义的生命周期事件期间将mWebView添加到容器视图(FrameLayout或类似视图)。当活动暂停或停止时,您需要从容器中删除它。我使用了onResume和onPause,取得了很好的效果。
https://stackoverflow.com/questions/15103141
复制相似问题