Android开发之WebView的使用
http://note.youdao.com/share/?id=d4e2e028fc96f3448442c5e490bc6324&type=note
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;
}
补充: