再此之前曾经转载过一遍文章,详见:webview总结。最近有时间又重新研究了一下webview,做一下总结。
在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。
什么是webkit
WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。 同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。
传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。不过, 随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如Google Chrome和Maxthon 3采用V8引擎,却仍然宣称自己是WebKit内核)。
1.WebView加载网页的三种方式:loadUrl,loadData,loadDataWithBaseURL
loadUrl(String url) 设置当前WebView需要访问的网址
互联网用:webView.loadUrl("http://www.baidu.com");
注: AndroidManifest.xml中必须使用许可"android.permission.INTERNET"才可访问网络
本地页面放在assets目录下用:webView.loadUrl("file:///android_asset/html/XX.html");
本地页面也可放在sdcard目录下:webView.loadUrl(file:///mnt/sdcard/test/test.html");
loadData(String data, String mimeType, String encoding), 容易导致乱码, 优先选择
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
二者区别参看文章:
http://blog.csdn.net/u011206077/article/details/10142999
http://www.csdn123.com/html/itweb/20131016/169685.htm
2.了解WebSettings, WebViewClient, WebChromClient相对于WebView的功能
WebSettings用来设置WebView的一些属性、状态等。在创建WebView时,系统有一个默认的设置,我们可以通过WebView.getSettings来得到这个设置:
WebSettings webSettings=mWebView.getSettings();
WebSettings和WebView都在同一个生命周期中存在,当WebView被销毁后,如果再使用WebSettings则会抛出IllegalStateException异常。
下面是设置WebSettings一些常用属性、状态的方法:
setAllowFileAccess 启用或禁止WebView访问文件数据
setBlockNetworkImage 是否显示网络图像
setBuiltInZoomControls 设置是否支持缩放
setCacheMode 设置缓存的模式 http://blog.csdn.net/t12x3456/article/details/13745553
setDefaultFontSize 设置默认的字体大小
setDefaultTextEncodingName 设置在解码时使用的默认编码
setFixedFontFamily 设置固定使用的字体
setJavaScriptEnabled 设置是否支持Javascript
setLayoutAlgorithm 设置内容布局
setLightTouchEnabled 设置用鼠标激活被选项
setPluginsEnabled 支持插件
setUseWideViewPort 调整图片大小适应webview的大小
缓存模式分析:
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,
如:www.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。
www.360.com.cn的cache-control为max-age=60,在两种模式下都使用本地缓存数据。
总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。
WebViewClient就是专门辅助WebView处理各种通知、请求等事件的类。比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到http认证需要处理、页面键盘响应、页面中的url打开处理等等。可以通过WebView的setWebViewClient方法来指定一个WebViewClient对象。WebViewClient提供了如下的一些方法,我们可以覆盖这些方法来辅助WebView浏览网页,代码如下(我们设置覆盖shouldOverrideUrlLoading方法,使得当有新连接时,使用当前的WebView来显示):
public boolean shouldOverrideUrlLoading(WebView view,String url){
view.loadUrl(url);
return true;
}
onPageFinished 网页加载完毕时调用,但此时渲染图片有可能没有加载完成。
onLoadResource 加载资源时被调用
onPageStarted 网页开始加载
onReceivedError 报告错误信息
onScaleChanged WebView发生改变
shouldOverrideUrlLoading 控制新的连接在当前WebView中打开
WebChromeClient用来辅助WebView处理Javascript的对话框、网站图标、网站Title、加载进度、关闭和隐藏、页面加载进展、警告框、js加载前、js操作超时、webView获得焦点等等,WebChromeClient中的方法不是很多,其功能如下所示:
下面实现onReceivedTitle方法,用于更改应用程序的Title,代码如下:
public void onReceivedTitle(WebView view,String title){
Activity01.this.setTitle(title);
super.onReceivedTitle(view,title);
}
onJsAlert 处理Javascript中的Alert对话框
onJsConfirm处理Javascript中的Confirm对话框
onJsPrompt 处理Javascript中的Prompt对话框
onProgressChanged 加载进度条改变
onReceivedIcon 网页图标更改
onReceivedTitle 网页Title更改
3.WebView的缓存处理文章参考:http://my.oschina.net/mycbb/blog/330422