我搜索了许多帖子但仍无法找到问题的答案。我正在处理使用Android
的{{1}}应用。
我使用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
变量/ environment / workspace。当应用程序在后台被杀死然后恢复时,整个Javascript都随着所有对象/变量而消失。 javascript代码是名称间隔的,即Javascript
,window.utilitiesPack
,window.eventHandlers
等,并且它们未定义。此外,还使用window.automation
和其他javascript插件:恢复状态后,所有这些插件似乎都未定义。基本上整个Javascript都没有恢复。
有人可以确认或反驳这是真的吗(Javascript没有保存)?如果没有保存整个Javascript工作区,那么JQuery
究竟保存了什么?是否有一些简单/优雅的方法来使用现有的API来保存Javascript对象?
// ============================================= =========
Update1:所以问题仍然存在。最重要的困难是:
我正在为结果启动相机WebView.saveState()
。拍照时,应用会返回Intent
活动,并且应该使用Javascript来更新带有一些数据变量的HTML5 WebView
。
显示Camera Activity时,LocalStorage
的主要活动被杀死,所以当我们回到WebView时,不再有Javascript,也没有我可以从Android代码调用的函数。这种情况每次都发生在WebView
上。它仍然发生在其他手机上,但不是每次都拍照。
不知道该怎么做。不知何故,我必须使用WebView制作主Activity,以便在使用Camera Intent拍摄照片时保持状态。有谁知道如何实现这一目标?
答案 0 :(得分:8)
正如user2113581评论的那样,将WebView移动到应用程序的上下文而不是Activity是一个潜在的解决方案。这仍然存在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);
}
}
最后,在您的Activity中,您需要在有意义的生命周期事件期间将mWebView
添加到容器视图(FrameLayout或类似的)。暂停或停止活动时,您需要将其从容器中删除。我使用onResume
和onPause
效果很好。
答案 1 :(得分:3)
找到的信息很少,只有这一行:
请注意,此方法不再存储此WebView的显示数据。如果从未调用restoreState(Bundle),则先前的行为可能会泄漏文件。
和这一行:
返回用于保存状态的后退/前进列表的相同副本。
在WebView.saveState(Bundle)
的javadoc中。