我正在制作一个Android应用,这是一个嵌入在网络视图中的复杂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 app中失去工作。
然后,我尝试通过覆盖onConfigurationChanged
来手动处理配置更改。此方法保留了旋转状态和其他配置更改,但是当用户按下Android后退按钮(这会破坏活动)时,显示状态全部丢失。
我现在正在考虑将web视图存储在onCreate包中保留的片段中,但我不确定是否保留了显示状态。
我也在考虑重写onDestroy来查询当前应用状态(例如某些Blob或json格式)的Web视图中的javascript,然后将其存储在捆绑包中(甚至存储在本地SQLite blob中),但是我在Android中找不到用于轮询javascript状态的同步方法。我可以将java对象发送到使用Android的addJavascriptInterface方法维护应用程序状态的javascript中,但计算Web应用程序的状态需要大量工作 - 我不想定期轮询状态在网络应用程序中使用计时器。
有关如何跨活动销毁保留Web视图的显示状态(如在动态创建的任何DOM元素或文本输入中)的任何想法?或者如何记住显示状态以便以后重新构建?
我觉得这对于那些基本上希望通过嵌入在网络视图中的javascript集中支持Android应用程序的开发人员来说是一个障碍。
答案 0 :(得分:3)
您只需要将WebView中的代码视为Web应用程序,并使用storage features provided by HTML。确保通过WebSettings启用它们(使用this和this设置)。或者,使用通过注入的Java对象公开的类似功能,这样您就可以轻松地修改Java代码中的存储数据。
DOM和JS的状态实际上非常复杂,并且可能涉及网络连接(通过XHR和WebSockets),因此尝试将其保存为转储是一种失败的努力。