长时间睡眠后,Android webview无法响应

时间:2016-06-28 05:01:34

标签: android webview android-lifecycle

我有一个小小的爱好应用我正在努力。它在主要布局中使用webview。单击webview内的链接可使用户保持在Webview中。启动后,仍然在应用程序内部,一切都很好。然而,在手机睡了一段时间后我重新打开应用程序从我离开的地方冲浪,我注意到一些意想不到的行为。

  1. 网页加载文本但不加载图片(问号或只是图像预期的空白区域)。
  2. 点击网页视图内网页内的链接会将用户从网页视图中删除,并尝试打开外部浏览器。
  3. 作为参考,我已经完成了:

    @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上创建一个加载栏来显示页面加载进度。

1 个答案:

答案 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()受保护的函数,因为它似乎没有做任何与我有关的事情。

如果我忽略了解决方案中的任何内容,仍然欢迎提出意见和建议。谢谢。