Webview保存页面状态
Posted
技术标签:
【中文标题】Webview保存页面状态【英文标题】:Webview saving state of page 【发布时间】:2013-08-16 09:48:42 【问题描述】:我正在使用的 webview 有一个小问题。我正在尝试使用 webview 来允许用户填写注册表单。当用户在一个会话中完成表单时,这可以正常工作,但如果用户锁定他们的手机,webview 活动就会被破坏。
我在内存中有两个活动,其中一个是内存密集型的。我相信我遇到的问题是,因为这个其他活动需要比 webview 更多的内存,所以 webview 被破坏了。
在某种程度上我对此表示满意,但我真的希望能够保存网页的当前状态,这样用户就不必再次提交所有详细信息。无论如何我可以做到这一点。
谢谢
【问题讨论】:
只有在锁定屏幕或旋转屏幕时才销毁活动? 可能重复***.com/questions/10258772/android-webview-savestate 我相信只是锁定,我遇到了方向问题,但在 android manifest 中修复了这个问题。 @lxx 会实际保存表单本身的状态,即当前写入表单的文本吗? 好的,当您按下主页按钮并重新打开应用程序时? 【参考方案1】:试试看:- 您可以使用 WebView 方法 saveState()/restoreState() 并将其保存到活动 onRestore 包中,如果前一个活动将被销毁,则在 onCreate 方法中使用保存的值。 您可以使用此处描述的类似方法(但仅用于配置更改): http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/
【讨论】:
"请注意,此方法不再存储此 WebView 的显示数据。" developer.android.com/reference/android/webkit/…【参考方案2】:我们遇到了类似的问题。我们有一个带有 webview 的活动。 我们希望用户在 web 视图中的表单上输入 3 个字段,然后启动一个新的活动(相机)来拍照。当我们取回图片时,我们使用 javascript 将图片插入到当前活动的 webview 表单中。这一切在 99.9% 的时间里都很好用。然而,在一些难以重现的奇怪场景中,当相机活动处于活动状态时,其背后的 webview 活动会被破坏。 saveState / restoreState 仅部分恢复 webview。启动相机时用户输入但未提交的 3 个表单字段现在丢失了。它们不会被 webview.saveState 保存。此外,页面上的一些 javascript 状态也丢失了。
为了解决这个问题,我们向页面添加了一个 javascript 方法,并在 saveInstanceState 上从应用程序调用它。然后在我们恢复状态后,我们在 webview 页面上调用另一个 javascript 方法来恢复状态。这是一种痛苦,但需要为您需要这样做的每种形式进行工作,但它确实有效。
我希望未来版本的 Android webview.saveState 将其保存为 Activity 被销毁之前的状态。或者,如果您将 Activity 标记为对您的应用至关重要,并且仅在您的应用不是用户正在使用的当前应用时才允许销毁该 Activity,那就太好了。
【讨论】:
【参考方案3】:试试WebView.addJavascriptInterface,在Activity.onPause时,通过loadUrl("javascript:...")调用页面中的javascript方法,在网页中调用WebView.addJavascriptInterface提供的native方法保存数据。这是你想要的吗?
【讨论】:
也许可以,我必须调查一下才能确定它是否合适。【参考方案4】:一个activity可以在按下返回键时被销毁;当屏幕旋转时(更快地破坏活动并重新创建所有图形元素);或者什么时候它可能在一段时间内不会激活(锁定手机、按 Home 键或启动其他应用程序)。
你需要这样做@Ixx 在他的评论中建议:Android webView saveState
用类似的东西保存应用程序的数据
@Override
public void onSaveInstanceState(Bundle outState)
super.onSaveInstanceState(outState);
/// save your things, e.g.
outState.putString("name", name);
并且恢复,它存在于方法onCreate
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
// if it is a new activity
if (savedInstanceState == null)
// initialize vars, e.g.
name = "Unknown";
// if is a call after detroy the activity
else
// recover vars, e.g.
name = savedInstanceState.getString("name");
【讨论】:
那么在你说“保存你的东西”的地方,我是否需要专门检查文本字段或类似的内容并保存该数据,还是应该为我保存这些数据? 对不起,还有一个问题,我将如何访问文本字段中的数据? 之前 saveState() 可以用来保存 webview 的状态,但显然不再支持,也许 saveWebArchive() 可以工作。 也许我必须说 saveData “不再存储此 WebView 的显示数据。”以上是关于Webview保存页面状态的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android Lollipop 中保存 WebView 状态并恢复它?
如何在 Android Lollipop 中保存 WebView 状态并恢复它?