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效果很好.
查到的资料很少,只有这一行:
请注意,此方法不再存储此 WebView 的显示数据。如果从未调用过restoreState(Bundle),则先前的行为可能会泄漏文件。
和这一行:
返回用于保存状态的后退/前进列表的相同副本。
在 javadoc 中WebView.saveState(Bundle).