Android WebView 优化梳理( 二 )


@Overrideprotected void onDestroy() {try {//有音频播放的web页面的销毁逻辑//在关闭了Activity时 , 如果Webview的音乐或视频 , 还在播放 。就必须销毁Webview//但是注意:webview调用destory时,webview仍绑定在Activity上//这是由于自定义webview构建时传入了该Activity的context对象//因此需要先从父容器中移除webview,然后再销毁webview:if (webView != null) {ViewGroup parent = (ViewGroup) webView.getParent();if (parent != null) {parent.removeView(webView);}webView.removeAllViews();webView.destroy();webView = null;}} catch (Exception e) {}super.onDestroy();}5.自定义加载异常error的状态页面 , 比如下面这些方法中可能会出现error原因:当WebView加载页面出错时(一般为404 NOT FOUND,Android WebView会默认显示一个出错界面 。当WebView加载出错时 , 会在WebViewClient实例中的onReceivedError() , 还有onReceivedTitle方法接收到错误 。
解决方法:自定义错误页面样式 。
@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);String host = Uri.parse(url).getHost();if (!BuildConfig.IS_DEBUG) {if (Arrays.binarySearch(domainList, host) < 0) {//不在白名单内 , 非法网址 , 这个时候给用户强烈而明显的提示} else {//合法网址}}}6. WebView加载证书错误原因:webView加载一些别人的url时候 , 有时候会发生证书认证错误的情况 。
解决方法:要将正常的呈现页面给用户 , 我们需要忽略证书错误 , 需要调用WebViewClient类的onReceivedSslError方法 , 调用handler.proceed()来忽略该证书错误 。
//在onResume里面设置setJavaScriptEnabled(true) 。@Overrideprotected void onResume() {super.onResume();if (mWebView != null) {mWebView.getSettings().setJavaScriptEnabled(true);}}//在onStop里面设置setJavaScriptEnabled(false);@Overrideprotected void onStop() {super.onStop();if (mWebView != null) {mWebView.getSettings().setJavaScriptEnabled(false)}}7.WebView音频播放销毁后还有声音原因:WebView页面中播放了音频,退出Activity后音频仍然在播放 。
解决方法:需要在Activity的onDestory()中从父容器中移除WebView 。
@Overrideprotected void onDestroy() {try {//有音频播放的web页面的销毁逻辑//在关闭了Activity时 , 如果Webview的音乐或视频 , 还在播放 。就必须销毁Webview//但是注意:webview调用destory时,webview仍绑定在Activity上//这是由于自定义webview构建时传入了该Activity的context对象//因此需要先从父容器中移除webview,然后再销毁webview:if (webView != null) {ViewGroup parent = (ViewGroup) webView.getParent();if (parent != null) {parent.removeView(webView);}webView.removeAllViews();webView.destroy();webView = null;}} catch (Exception e) {}super.onDestroy();}8.如何设置白名单操作原因:客户端内的WebView都是可以通过客户端的某个schema打开的 , 而要打开页面的URL很多都并不写在客户端内 , 而是可以由URL中的参数传递过去的 。上面4.0.5 使用scheme协议打开链接风险已经说明了scheme使用的危险性 。
解决方法:设置运行访问的白名单 , 或者当用户打开外部链接前给用户强烈而明显的提示 。设置白名单操作其实和过滤广告是一个意思 , 这里你可以放一些合法的网址允许访问 。
【Android WebView 优化梳理】@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);String host = Uri.parse(url).getHost();if (!BuildConfig.IS_DEBUG) {if (Arrays.binarySearch(domainList, host) < 0) {//不在白名单内 , 非法网址 , 这个时候给用户强烈而明显的提示} else {//合法网址}}}9.Android后台无法释放js导致发热耗电原因:有些手机你如果webView加载的html里 , 有一些js一直在执行比如动画之类的东西 , 如果此刻webView 挂在了后台这些资源是不会被释放用户也无法感知 。导致一直占有cpu 耗电特别快 。
解决方法:WebView在后台的时候 , 会调用onStop方法 , 即此时关闭js交互 , 回到前台调用onResume再开启js交互 。
//在onResume里面设置setJavaScriptEnabled(true) 。@Overrideprotected void onResume() {super.onResume();if (mWebView != null) {mWebView.getSettings().setJavaScriptEnabled(true);}}//在onStop里面设置setJavaScriptEnabled(false);@Overrideprotected void onStop() {super.onStop();if (mWebView != null) {mWebView.getSettings().setJavaScriptEnabled(false)}}10.WebView加载网页不显示图片原因:WebView从Lollipop(5.0)开始webView默认不允许混合模式, https当中不能加载http资源, 而开发的时候可能使用的是https的链接 , 但是链接中的图片可能是http的,所以显示图片失败 。


推荐阅读