android WebView开发总结

再此之前曾经转载过一遍文章,详见: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

你可能感兴趣的:(android)