我有一个小小的爱好应用我正在努力。它在主要布局中使用webview。单击webview内的链接可使用户保持在Webview中。启动后,仍然在应用程序内部,一切都很好。然而,在手机睡了一段时间后我重新打开应用程序从我离开的地方冲浪,我注意到一些意想不到的行为。
作为参考,我已经完成了:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
webview.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
webview.restoreState(savedInstanceState);
}
以及onCreate代码中的内容:
if (savedInstanceState != null) {
webview.restoreState(savedInstanceState);
}else{
// this means my app is starting from scratch and do the necessary webview loading
}
我不确定我错过了什么,但是长时间睡眠之后,由于缺乏更好的术语,webview似乎,呃,"打破了#34;我尝试过搜索有关此问题的更多信息,但没有看到更多人遇到此问题。要么人们不希望以这种方式使用webview,要么我做错了什么。我认为它是后者。
感谢您的反馈。
更多信息: webview是应用程序的根活动。复制问题的步骤只是在webview中按主菜单,以便应用程序在webview活动中暂停,等待或让手机睡眠,打开手机,打开应用程序,并在最后一页webview加载时重新启动活动。等待足够长的时间,webview活动将展示所提到的行为。
我还在onResume,onPause,onStop,onDestroy上设置了基本的生命周期函数,它们都调用了各自的超级函数等。
我也使用WebViewClient和WebChromeClient。
我的WebViewClient只负责" onPageStarted"," onReceivedError"," shouldOverloadUrlLoading"和" onPageFinished"。
另一方面,我的WebChromeClient只能在GeolocationPermissionShowPrompt"和" onProgressChanged"。
两者都可以在webview上创建一个加载栏来显示页面加载进度。
答案 0 :(得分:1)
所以,我已经做了很多测试,但最有用的是生命周期onResume,onPause,onStop,onDestroy以及onSaveInstanceState和onRestoreInstanceState中每个生命周期中的Toast消息。
我正在使用像这样的代码块(恢复状态)[重写上面的代码]:
if(savedInstanceState!=null){
webview.restoreState(savedInstanceState);
}else{
// do the webview getsettings such as setUseWideViewPort and setSupportZoom
// setInitialScale, setJavaScriptEnabled, etc..
// as well as setting WebViewClient and WebChromeClient
// then preloading the webview with the default url
}
由于里面有Toast消息进行调试,我注意到经过长时间的睡眠后,Android显然会杀死我的活动并再次调用onCreate。我没有考虑的是webview.restoreState没有恢复关于webview的一切。
它不能恢复"其他"挡在上面。实际上,在此期间设置的任何内容都会消失。因此,只保存了网站,没有WebView和WebChrome客户端。
这导致了上述行为。
从" else"移动设置块。阻止它,我的webview能够使用必要的设置再次设置自己。
添加信息:我还删除了onRestoreInstanceState()受保护的函数,因为它似乎没有做任何与我有关的事情。
如果我忽略了解决方案中的任何内容,仍然欢迎提出意见和建议。谢谢。