我正在制作一个Android应用程序,它是一个嵌入在web视图中的复杂javascript应用程序。每当主活动被破坏时(即由于旋转、后退按钮按下等),web视图都会刷新。
为了保持网页的状态,我要覆盖onSaveInstanceState
和onRestoreInstanceState
:
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
// Save the state of the WebView
webView.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
// Restore the state of the WebView
webView.restoreState(savedInstanceState);
}
这阻止了刷新,但未能保持网页的显示状态,这对我来说很重要,因为用户会丢失存储在显示状态下的复杂js应用程序中的工作。
然后,我尝试通过重写onConfigurationChanged
来手动处理配置更改。此方法为旋转和其他配置更改保留了状态,但当用户按下Android后退按钮时,显示状态全部丢失(这会破坏活动)。
我现在正在考虑将web视图存储在onCreate捆绑包中保留的片段上,但我不确定这是否保留了显示状态。
我也在考虑覆盖onDestroy,在web视图中查询当前应用程序状态的javascript(比如以某种Blob或json格式),然后将其存储在捆绑包中(甚至存储在本地SQLite Blob中),但我在Android中找不到轮询javascript状态的同步方法。我可以通过Android的addJavascriptInterface方法将一个java对象发送到javascript中,该javascript可以维护应用程序的状态,但计算web应用程序的状况需要大量工作——我不想在web应用程序中使用计时器定期轮询状态。
关于如何在活动破坏期间保持web视图的显示状态(如动态创建的任何DOM元素或文本输入),有什么想法吗?或者如何记住显示状态以便以后重新构建?
我觉得这对那些基本上想让安卓应用程序由嵌入在web视图中的javascript集中驱动的开发人员来说是一个障碍。
您只需要将WebView中的代码视为web应用程序,并使用HTML提供的存储功能。请确保通过WebSettings启用它们(使用此设置和此设置)。或者,使用通过注入的Java对象公开的类似功能,这样您就可以轻松地修改Java代码中存储的数据。
事实上,DOM和JS的状态非常复杂,并且可能涉及网络连接(通过XHR和WebSockets),所以尝试将其保存为转储是徒劳的。