Android开发之WebView的使用


http://note.youdao.com/share/?id=d4e2e028fc96f3448442c5e490bc6324&type=note


Android开发之WebView的使用


android view添加显示 android webview加载流程_数据



Webkit网页渲染流程:


知识点概述:


WebView加载网页的两种方式:loadUrl() , loadData(),  LoadDataWithBaseURL()


了解WebSettings, WebViewClient, WebChromeClient相对于WebView的作用


WebView与javascript相互调用(难点)



知识点详述:


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://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             设置缓存的模式   


  setDefaultFontSize       设置默认的字体大小


  setDefaultTextEncodingName  设置在解码时使用的默认编码


  setFixedFontFamily     设置固定使用的字体


  **** setJavaScriptEnabled   设置是否支持Javascript


  setLayoutAlgorithm


  setLightTouchEnabled   设置用鼠标激活被选项


 


缓存模式分析:


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发生改变



补充:对”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; 

 

                  }


补充: