首页 > 代码库 > 关于WebView的一些用法探讨

关于WebView的一些用法探讨

众所周知,WebView是Android的一个重要视图组件,它基于WebKit内核,相当于一个内置浏览器,因此它主要的功能就是显示网页。其实WebView的功能非常强大,随着Web前端技术和Html5的发展,越来越多的APP不再是单纯的native开发,而是结合了Web方式,更有的甚至完全是Web APP的方式,当然其性能问题那就另讲了。相信每个开发者都或多或少地用过WebView,因此这里不再探讨WebView如何打开一个网页或者如何打开一个本地Html文件,我们来探讨一些WebView不常用或相对比较高级一点的用法。

一、在当前WebView中调用手机浏览器打开链接

先来看WebView的一个方法,如下图:

技术分享

想要在WebView中调用浏览器打开链接时,需要在shouldOverrideUrlLoading(WebView view, String url)方法里做相应处理,来看下该回调方法的说明文档:

<span style="font-size:12px;">Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url. This method is not called for requests using the POST "method".</span>

大意是在WebView即将加载一个新的url时,会触发该回调,该回调让宿主程序来决定该url被谁处理,如果没有设置WebViewClient ,则Activity Manager会自动选择一个合适的处理程序,如果设置了WebViewClient ,那么该方法返回true时,即让宿主程序来处理这个url,如果返回false,则让当前WebView来处理该url,另外如果该url请求为post方式时则该回调不会被触发。

理解了该回调,则很容易调用浏览器打开新链接了。由于我们设置了WebViewClient ,那么就让该方法返回true,这样url就不会被当前WebView打开了。在WebView中调用手机浏览器打开链接的详细代码为(以打开网易为例):

技术分享

二、在WebView中点击链接跳转Activity

这种功能的实现依然依赖shouldOverrideUrlLoading(WebView view, String url)方法,通过该方法可以获取url,那么我们就可以随心所欲地跳转Activity了。总结一下有两种方式:1.完全依赖客户端与Web网页之间约定的协议2.利用协议加Intent。第2种跳转方式在之前的一篇文字《Android平台好友点击微信分享的内容后跳转来源App的实现方案研究》中讲过,这里不再多说。来看第1种方法,比如一个捕捉到的url为“scheme://firstid/secondid/……”,这个协议可以任意扩展,或者不用“/”,使用自己方便解析的格式,既然可以任意扩展,就可以附带各种信息和数据,上述示例仅附带了两个id,如果我们预先定义了一个id跟Activity的映射,那么就可以在WebView中点击链接时跳到指定的Activity。

三、在WebView中禁止打开某个或某些新的链接

到了这里,是否觉得这个功能的实现已经很简单了?没错,依然是在shouldOverrideUrlLoading(WebView view, String url)中处理。以下示例是禁止在WebView中打开网易:

技术分享

四、WebView显示gif动画图片

使用WebView显示gif动画很简单,可以直接加载,不需要做任何额外的处理,如:

String gif_path = "http://ww4.sinaimg.cn/bmiddle/dc66b248gw1elgpbzghoog208m08w4qq.gif";

webView.loadUrl(gif_path);

之所以提一下这一点,是因为很多人想尽办法重写ImageView控件,虽然有很多方案,通过各种方式来解析并让其显示gif格式的图片,但在版本兼容和性能方面都不甚理想。就目前的状况来看,个人认为WebView是展示gif图片的最佳组件,不排除以后Android会推出可以显示gif图片的更强大的ImageView。

五、WebView启用缓存方式

由于WebView加载网页数据,内存及流量开销都很大,因此缓存模式显得很有必要,当你打开一连串网页,返回上一个网页时,如果有缓存数据就不会重新请求,可以节省流量并提升加载速度和用户体验。WebView启用缓存很简单,调用WebSettings的setCacheMode(int mode)方法即可,如webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);参数WebSettings.LOAD_CACHE_ELSE_NETWORK表示如果缓存资源可用,即便它们过期也要使用,否则才从网络下载,当然你也可以根据需求选择其他缓存模式。

六、WebView中JavaScript与Java交互

在App中JS与Java的交互越来越多,它们的交互遵循一定的规则,之前转发过一篇讲的很全的文章《Android中Java和JavaScript交互》,这里就不再赘述。值得一提的是对应前面的setWebViewClient(WebViewClient client)方法(WebViewClient除了shouldOverrideUrlLoading回调之外,还有onPageStarted、onPageFinished、shouldOverrideKeyEvent等其他回调,它们都很有用,可以帮你完成本文之外的其他功能),WebView还有一个setWebChromeClient(WebChromeClient client),这个方法在处理与JavaScript的交互时就大有用处了。


                                                                                                                                ——转载请注明出处,谢谢!


关于WebView的一些用法探讨