Android中webView实战详解.docx
- 文档编号:27706477
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:16
- 大小:21.41KB
Android中webView实战详解.docx
《Android中webView实战详解.docx》由会员分享,可在线阅读,更多相关《Android中webView实战详解.docx(16页珍藏版)》请在冰豆网上搜索。
Android中webView实战详解
Android中webView实战详解
一、WebView
谷歌提供的系统组件,用来加载和展现html网页,其采用webkit内核驱动,来实现网页浏览功能。
拥有load()URL和本地html文件。
注意:
1.loadUrl()必须在主线程中执行。
2.加载在线网页地址是会用到联网permission权限的,所以需要在AndroidManifest.xml中写入下面代码申请权限:
name="android.permission.INTERNET"/> 3.打开本地html文件时,是不需要设置WebViewClient,对应的asstes目录的url为: file: ///android_asset/xxxxx。 4.WebView基本设置 如果我们需要设置WebView的属性,是通过WebView.getSettings()获取设置WebView的WebSettings对象,然后调用WebSettings中的方法来实现的。 //是否支持缩放,配合方法setBuiltInZoomControls使用,默认true setSupportZoom(booleansupport) //是否需要用户手势来播放Media,默认true setMediaPlaybackRequiresUserGesture(booleanrequire) 是否显示窗口悬浮的缩放控制,默认true setDisplayZoomControls(booleanenabled) 是否允许访问WebView内部文件,默认true setAllowFileAccess(booleanallow) 是否保存表单数据,默认false setSaveFormData(booleansave) //设置页面文字缩放百分比,默认100% setTextZoom(inttextZoom) 。 。 。 。 。 。 二、WebViewClient WebViewClient主要辅助WebView执行处理各种响应请求事件的,比如: 1.onLoadResource(WebViewview,Stringurl) 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。 publicvoidonLoadResource(WebViewview,Stringurl){ //TODOAuto-generatedmethodstub if(DEBUG){ Log.d(TAG,"onLoadResource"); } super.onLoadResource(view,url); } -onPageStarted(WebViewview,Stringurl,Bitmapfavicon) 在页面加载开始时调用。 publicvoidonPageStarted(WebViewview,Stringurl,Bitmapfavicon){ //TODOAuto-generatedmethodstub if(DEBUG){ Log.d(TAG,"onPageStarted"); } if(url.endsWith(".apk")){ download(url);//下载处理 } super.onPageStarted(view,url,favicon); } -onPageFinished(WebViewview,Stringurl) 在页面加载结束时调用。 -onReceivedError(WebViewview,interrorCode,Stringdescription,StringfailingUrl) 加载错误的时候会回调,在其中可做错误处理,比如再请求加载一次,或者提示404的错误页面 这里有四个参数: +WebViewview: 当前的WebView实例 2.interrorCode: 错误码 3.Stringdescription: 错误描述 4.StringfailingUrl: 当前出错的URL 如加载返回错误时,重新加载错误页面: mWebView.setWebViewClient(newWebViewClient(){ @Override publicvoidonReceivedError(WebViewview,interrorCode,Stringdescription,StringfailingUrl){ super.onReceivedError(view,errorCode,description,failingUrl); mWebView.loadUrl("file: ///android_asset/error.html"); } }); shouldOverrideUrlLoading(WebViewview,Stringurl) 拦截url跳转,在里边添加点击链接跳转或者操作 publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){ //拦截某个URL,将其转换成其它URL可以在这里做 view.loadUrl(url); returntrue; } 在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。 比如,我们拦截所有包含“”的地址,将其替换成””: publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){ if(url.contains("")){ view.loadUrl(""); }else{ view.loadUrl(url); } returntrue; } 或者 mWebView.setWebViewClient(newWebViewClient(){ @Override publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){ if(url.contains("")){ view.loadUrl(""); } returnfalse; } } 在利用shouldOverrideUrlLoading来拦截URL时,如果returntrue,则会屏蔽系统默认的显示URL结果的行为,不需要处理的URL也需要调用loadUrl()来加载进WebVIew,不然就会出现白屏;如果returnfalse,则系统默认的加载URL行为是不会被屏蔽的,所以一般建议大家returnfalse,我们只关心我们关心的拦截内容,对于不拦截的内容,让系统自己来处理即可。 shouldInterceptRequest(WebViewview,Stringurl) 在每一次请求资源时,都会通过这个函数来回调,比如超链接、JS文件、CSS文件、图片等,也就是说浏览器中每一次请求资源时,都会回调回来,无论任何资源! 但是必须注意的是shouldInterceptRequest函数是在非UI线程中执行的,在其中不能直接做UI操作,如果需要做UI操作,则需要利用Handler来实现,该函数声明如下: publicWebResourceResponseshouldInterceptRequest(WebViewview,Stringurl){ returnnull; } 该函数会在请求资源前调用,我们可以通过返回WebResourceResponse的处理结果来让WebView直接使用我们的处理结果。 如果我们不想处理,则直接返回null,系统会继续加载该资源。 利用这个特性,我们可以解决一个需求: 假如网页中需要加载本地的图片,我们就可以通过拦截shouldInterceptRequest,并返回结果即可。 如下: mWebView.setWebViewClient(newWebViewClient(){ @Override publicWebResourceResponseshouldInterceptRequest(WebViewview,Stringurl){ try{ if(url.equals("http: //localhost/pic.png")){ AssetFileDescriptorfileDescriptor=getAssets().openFd("drawable.jpg"); InputStreamstream=fileDescriptor.createInputStream(); WebResourceResponseresponse=newWebResourceResponse("image/png","UTF-8",stream); returnresponse; } }catch(Exceptione){ Log.e(TAG,e.getMessage()); } returnsuper.shouldInterceptRequest(view,url); } }); 当发现当前加载资源的url是我们自定义的http: //localhost/pic.png时,就直接将本地的图片drawable.jpg作为结果返回。 onReceivedSslError(WebViewview,SslErrorHandlerhandler,SslErrorerror) HTTPS协议是通过SSL来通信的,所以当使用HTTPS通信的网址(以https: //开头的网站)出现错误时,就会通过onReceivedSslError回调通知过来,它的函数声明为: publicvoidonReceivedSslError(WebViewview,SslErrorHandlerhandler,.http.SslErrorerror){ handler.proceed(); } WebViewview: 当前的WebView实例 SslErrorHandlerhandler: 当前处理错误的Handler,它只有两个函数SslErrorHandler.proceed()和SslErrorHandler.cancel(),SslErrorHandler.proceed()表示忽略错误继续加载,SslErrorHandler.cancel()表示取消加载。 在onReceivedSslError的默认实现中是使用的SslErrorHandler.cancel()来取消加载,所以一旦出来SSL错误,HTTPS网站就会被取消加载了,如果想忽略错误继续加载就只有重写onReceivedSslError,并在其中调用SslErrorHandler.proceed() SslErrorerror: 当前的的错误对象,SslError包含了当前SSL错误的基本所有信息。 如加载SSL出错的网站((12306是通过Https协议来传输的,但是它的SSL证书是有问题的,所以我们就以12306网站为例)) mWebView.setWebViewClient(newWebViewClient(){ @Override publicvoidonReceivedSslError(WebViewview,SslErrorHandlerhandler,SslErrorerror){ //一定要注释掉! //super.onReceivedSslError(view,handler,error); handler.proceed(); Log.e(TAG,"sslError: "+error.toString()); } }); mWebView.loadUrl(" 注意: 当出现SSL错误时,WebView默认是取消加载当前页面,只有去掉onReceivedSslError的默认操作,然后添加SslErrorHandler.proceed()才能继续加载出错页面当HTTPS传输出现SSL错误时,错误会只通过onReceivedSslError回调传过来,而不会触发onReceivedError回调的。 WebViewClient其余函数 /** *在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次 */ publicvoidonLoadResource(WebViewview,Stringurl) /** *(WebView发生改变时调用) *可以参考 */ publicvoidonScaleChanged(WebViewview,floatoldScale,floatnewScale) /** *重写此方法才能够处理在浏览器中的按键事件。 *是否让主程序同步处理KeyEvent事件,如过滤菜单快捷键的KeyEvent事件。 *如果返回true,WebView不会处理KeyEvent, *如果返回false,KeyEvent总是由WebView处理。 默认: false */ publicbooleanshouldOverrideKeyEvent(WebViewview,KeyEventevent) /** *是否重发POST请求数据,默认不重发。 */ onFormResubmission(WebViewview,MessagedontResend,Messageresend) /** *更新访问历史 */ doUpdateVisitedHistory(WebViewview,Stringurl,booleanisReload) /** *通知主程序输入事件不是由WebView调用。 是否让主程序处理WebView未处理的InputEvent。 *除了系统按键,WebView总是消耗掉输入事件或shouldOverrideKeyEvent返回true。 *该方法由event分发异步调用。 注意: 如果事件为MotionEvent,则事件的生命周期只存在方法调用过程中, *如果WebViewClient想要使用这个Event,则需要复制Event对象。 */ onUnhandledInputEvent(WebViewview,InputEventevent) /** *通知主程序执行了自动登录请求。 */ onReceivedLoginRequest(WebViewview,Stringrealm,Stringaccount,Stringargs) /** *通知主程序: WebView接收HTTP认证请求,主程序可以使用HttpAuthHandler为请求设置WebView响应。 默认取消请求。 */ onReceivedHttpAuthRequest(WebViewview,HttpAuthHandlerhandler,Stringhost,Stringrealm) /** *通知主程序处理SSL客户端认证请求。 如果需要提供密钥,主程序负责显示UI界面。 *有三个响应方法: proceed(),cancel()和ignore()。 *如果调用proceed()和cancel(),webview将会记住response, *对相同的host和port地址不再调用onReceivedClientCertRequest方法。 *如果调用ignore()方法,webview则不会记住response。 该方法在UI线程中执行, *在回调期间,连接被挂起。 默认cancel(),即无客户端认证 */ onReceivedClientCertRequest(WebViewview,ClientCertRequestrequest) 三、WebChromeClient 主要辅助WebView处理JavaScript的对话框、网站Logo、网站title、load进度等处理。 1.onCloseWindow(WebViewwindow) 通知主程序关闭WebView,并从View中移除,WebCore停止任何的进行中的加载和JS功能。 -onCreateWindow(WebViewview,booleanisDialog,booleanisUserGesture,MessageresultMsg) 请求主程序创建一个新的Window,如果主程序接收请求,返回true并创建一个新的WebView来装载Window,然后添加到View中,发送带有创建的WebView作为参数的resultMsg的给Target。 如果主程序拒绝接收请求,则方法返回false。 默认不做任何处理,返回false -onJsAlert(WebViewview,Stringurl,Stringmessage,JsResultresult) 当网页调用alert()来弹出alert弹出框前回调,用以拦截alert()函数 注意: +如果需要使网页中的confrim()、alert()、prompt()函数生效,需要设置WebChromeClient! +在使用onJsAlert来拦截alert对话框时,如果不需要再弹出alert对话框,一定要returntrue;在returnfalse以后,会依然调用系统的默认处理来弹出对话框的 +如果我们returntrue,则需要在处理完成以后调用JsResult.confirm()或者JsResult.cancel()来告诉WebView我们点中哪个按钮来取消程序对话框。 否则再次点击按钮将会失败 -onJsPrompt(WebViewview,Stringurl,Stringmessage,StringdefaultValue,JsPromptResultresult) 当网页调用prompt()来弹出prompt弹出框前回调,用以拦截prompt()函数 -onJsConfirm(WebViewview,Stringurl,Stringmessage,JsResultresult) 当网页调用confirm()来弹出confirm弹出框前回调,用以拦截confirm()函数 -onProgressChanged(WebViewew,intnewProgress) 通知程序当前页面加载进度 WebViewview: 当前WebView实例 intnewProgress: 当前的加载进度,值从0到100 -onReceivedIcon(WebViewview,Bitmapicon) 通知当前页面网站新图标 -onReceivedTitle(WebViewview,Stringtitle) 通知页面标题变化 -onShowCustomView WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。 四、CookieSync CookieManager CookieManager是用来管理Cookie的,主要来管理cookie相关,提供如下API: setAcceptCookie() setCookie() getCookie(Stringurl); removeSessionCookies(); hasCookies() removeAllCookie() CookieSyncManager CookieSyncManagerl继承WebSyncManager,来管理同步cookie相关,主要有以下API: resetSync() stopSync() sync() syncFromRamToFlash() checkInstanceIsAllowed() 实现cookie同步: CookieManagercookieManager=CookieManager.getInstance(); //接受服务器 cookiecookieManager.setAcceptCookie(true); //移除之前的cookie cookieManager.removeSessionCookie(); //注入cookies List for(Stringcookie: cookies){ cookieManager.setCookie(uri.getHost(),cookie); } //同步cookie CookieSyncManager.getInstance().sync(); 五、缓存模式 webview缓存模式有5种,具体方式: +LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据 +LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。 +LOAD_CACHE_NORMAL: APIlevel17中已经废弃,从APIlevel11开始作用同LOAD_DEFAULT模式 +LOAD_NO_CACHE: 不使用缓存,只从网络获取数据. +LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。 六、Native与JS相互调用 该模块是针对JsBridge进行封装的功能介绍: 1.Java调用js代码: publicvoidregisterHandler(finalStringhandlerName,finalJsHandlerhandler){ this.mWebView.registerHandler(handlerName
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android webView 实战 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)