Android开发之WebView的使用

来源:互联网 发布:淘宝村级服务站申请 编辑:程序博客网 时间:2024/04/30 10:52


                                        Android开发之WebView的使用

http://note.youdao.com/share/?id=d4e2e028fc96f3448442c5e490bc6324&type=note
Android开发之WebView的使用

Webkit网页渲染流程: http://blog.csdn.net/milado_nju/article/details/11661311
知识点概述:
1.WebView加载网页的两种方式:loadUrl() , loadData(), LoadDataWithBaseURL()
2.了解WebSettings, WebViewClient, WebChromeClient相对于WebView的作用
3.WebView与javascript相互调用(难点)

知识点详述:
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");  (注意前缀 file:///android_asset/...)
      本地页面也可放在sdcard目录下:webView.loadUrl(file:///mnt/sdcard/test/test.html");    (注意前缀 file:///mnt/sdcard/...)
    loadData(String data, String mimeType, String encoding),   容易导致乱码
    loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) 跟loadData相比,优先选择
http://blog.csdn.net/u011206077/article/details/10142999
http://www.csdn123.com/html/itweb/20131016/169685.htm
data:要加载的网页内容
mimetype:加载的网页内容的类型(text/html,image/jpeg, audio/mp3,vedio/mp4)
encoding: 指定编码(utf-8, gbk)  

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   设置用鼠标激活被选项
      setSupportZoom        设置是否支持变焦
缓存模式分析:

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处理各种通知、请求等事件的类。可以通过WebView的setWebViewClient方法来指定一个WebViewClient对象。WebViewClient提供了如下的一些方法,我们可以覆盖这些方法来辅助WebView浏览网页,代码如下(我们设置覆盖shouldOverrideUrlLoading方法,使得当有新连接时,使用当前的WebView来显示):
 public boolean shouldOverrideUrlLoading(WebView view,String url){
 view.loadUrl(url);
 return true;
 }
 onPageFinished网页加载完毕
 onPageStarted            网页开始加载
 onReceivedError          报告错误信息
 onScaleChanged          WebView发生改变
  shouldOverrideUrlLoading 控制新的连接在当前WebView中打开  **************************************

补充:对”Back”按键的处理:如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个webView进程会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。 
             webview.goBack();   //goBack()表示返回webView的上一页面

WebChromeClient用来辅助WebView处理Javascript的对话框、网站图标、网站Title、加载进度等。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(网页/javascript)与java相互调用
WebView不但可以运行一段HTML代码,还有一个重要特点,就是WebView可以同Javascript互相调用。
通过addJavascriptInterface(Object obj,String interfaceName)方法将一个Java对象绑定到一个Javascript对象中,Javascript对象名就是interfaceName,作用域是Global,这样便可以扩展Javascript的API,获取Android的数据。
同时,在Java代码中也可以直接调用Javascript方法,这样就可以互相调用取得数据了,代码如下:
WebView.loadUrl("javascript:方法名()");
注意: SDK2.3 OS对js的支持有问题,不起作用


课堂小结:
1、访问网络,必须添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
    2、设置WebView基本信息:
          如果访问的页面中有Javascript,则webview必须设置支持Javascript。
          webview.getSettings().setJavaScriptEnabled(true);  
    3、设置WevView要显示的网页:
          互联网用:webView.loadUrl("http://www.google.com"); 
          本地文件用:webView.loadUrl("file:///android_asset/XX.html");  
Android SDK提供了一个Schema,前缀为"file:///android_asset/".WebView遇到这样的Schema,就去当前包中的Assets目录中
    4、如果希望点击超链接由自己处理,而不是新开WebView进程中响应该链接。给WebView添加一个事件监听对象(WebViewClient)      
         并重写其中的一些方法
                shouldOverrideUrlLoading:对网页中超链接按钮的响应。
        当按下某个超连接时WebViewClient会调用这个方法,并传递参数:按下超链接的url  
    5、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
        覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
  public boolean onKeyDown(int keyCoder,KeyEvent event){
                        if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
                  webview.goBack();   //goBack()表示返回webView的上一页面
                                return true;
                        }
                        return false;
                }

补充: http://www.cnblogs.com/zyw-205520/archive/2013/02/15/2912865.html

0 0