一、基本介绍
WebView是一个基于webkit引擎,展示web页面的控件。WebView在低版本和高版本采用不同的webkit内核版本,4.4(API 19)之后直接使用Chrome。
1 作用
- 显示和渲染web网页。
- 直接使用html文件(网络和本地assets)作为布局。
- 和JavaScript交互调用。
2. 常用方法
2.1 加载一个页面
```java // 方式1. 加载一个页面 webView.loadUrl(“http://www.google.com“);
// 方式2:加载apk包中的html页面 webView.loadUrl(“file:///android_asset/indext.html”);
// 方式3:加载手机本地的html页面 webView.loadlUrl(“content://com.android.html/sdcard/index.html”);
// 方式4:加载 HTML 页面的一小段内容 webView.loadData(String data, String mimeType, String encoding);
<a name="HxOtm"></a>#### 2.2 WebView的状态```java// 激活WebView为活跃状态,能正常执行网页的响应webView.onResume();// 当页面被失去焦点被切换到后台不可见状态,需要执行onPause,// 通过onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。webView.onPause();// 当应用程序(存在webview)被切换到后台时,这个方法不仅仅针对当前的webview而是全局的全应用程序的webView// 它会暂停所有webview的layout、parsing、javascripttimer。降低CPU功耗webView.pauseTimers();// 恢复pauseTimes状态webView.resumeTimers();LinearLayout ll = findViewById(R.id.ll);ll.removeView(webView);webView.destroy();
2.3 页面切换
// 上一页webView.goBack();// 下一页webView.goForawrd();
2.4 清除缓存
// 清除页面访问留下的缓存,这个方法将清空整改应用程序的WebView缓存。webView.clearCache(true);// 清除低昂钱正在访问的页面外所有的访问历史记录webView.clearHistory();// 清除自动完成填表的表单数据,不会清除webView存储在本地的数据webView.clearFormData();
3. 常用工具类
3.1 WebSettings
// 获取WebSetting子类var webSettings = webView.settings// 支持JavaScript交互webSettings.javaScriptEnable = true// 支持flash插件webSetting.pluginState = WebSettings.PluginState.OFF// 设置自适应屏幕webSettings.setUserWideViewPort(true) // 将图片调整到适合WebView的大小webSettings.setLoadWithOveriewMode(true) // 缩放至屏幕大小webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局// 缩放操作webSettings.setSupportZoom(true) // 支持缩放,默认true,是下面设置的前提webSetting.setBuiltInZoomContrals(true) // 设置内置的缩放空间,若为false,则该WebView不可以缩放webSettings.setDisplayZoomContrals(false) // 隐藏原生的缩放控件webSettings.setTextZoom(2);//设置文本的缩放倍数,默认为 100// 关闭WebView中缓存webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK// 设置可以访问文件webSettings.allowFileAccess = true// 支持通过JS打开新窗口webSettings.javaScriptCanOpenWindowsAutomatically = true// 支持自动加载图片webSettings.loadsImagesAutomatically = true// 设置编码格式webSettings.defaultTextEncodingName = "UTF-8"// 5.1以上默认禁止了https和http混用,以下方式是开启if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);}//设置User-AgentwebSettings.setUserAgentString("Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0");//允许网页执行定位操作webSettings.setGeolocationEnabled(true);
WebView设置缓存,当加载 html 页面时,WebView会在/data/data/package/下生成 database 与 cache 两个文件夹
请求的URL记录保存在WebViewCache.db,而URL的内容是保存在WebViewCache文件夹下:
//缓存模式如下://LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据//LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。//LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.//LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。//优先使用缓存:webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//不使用缓存:webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE)
还有如下几种:
//开启 DOM storage API 功能 较大存储空间,使用简单settings.setDomStorageEnabled(true);//设置数据库缓存路径 存储管理复杂数据 方便对数据进行增加、删除、修改、查询 不推荐使用settings.setDatabaseEnabled(true);final String dbPath = context.getApplicationContext().getDir("db", Context.MODE_PRIVATE).getPath();settings.setDatabasePath(dbPath);//开启 Application Caches 功能 方便构建离线APP 不推荐使用settings.setAppCacheEnabled(true);final String cachePath = context.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();settings.setAppCachePath(cachePath);settings.setAppCacheMaxSize(5 * 1024 * 1024);
| 缓存机制 | 优势 | 适合场景 |
|---|---|---|
| 浏览器缓存机制 | HTTP协议层支持 | 静态文件的缓存 |
| Dom Storage | 较大存储空间,使用简单 | 临时、简单数据的缓存,Cookies的扩展 |
| Web SQL Database | 存储、管理复杂结构数据 | 用IndexedDB替代,不推荐使用 |
| AppChche | 方便构建离线APP | 离线APP、静态文件缓存,不推荐使用 |
| IndexedDB | 存储任何类型数据、使用简单、支持索引 | 结构、关系复杂的数据库存储、Web SQL Database的替代 |
| File System API | 支持文件系统的操作 | 数据适合以文件进行管理的场景,Android系统还不支持 |
3.2 WebViewClient
处理各种通知和请求事件
WebViewClient类常用方法
shouldOverrideUrlLoading():
拦截URL请求,重定向(有2个方法,一个是兼容5.0以下,一个是兼容5.0以上,保险起见两个都重写)。
无论返回true还是false,只要为WebView设置了WebViewClient,系统就不会再将url交给第三方的浏览器去处理了。
返回false,代表将url交给当前WebView加载,也就是正常的加载状态;
返回true,代表开发者已经对url进行了处理,WebView就不会再对这个url进行加载了。
另外,使用post的方式加载页面,此方法不会被调用。
webView.setWebViewClient(new WebViewClient(){//重定向URL请求,返回true表示拦截此url,返回false表示不拦截此url。@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {//作用1:重定向urlif(url.startsWith("weixin://")){url = url.replace("weixin://","http://");webView.loadUrl(url);}//作用2:在本页面的WebView打开,防止外部浏览器打开此链接view.loadUrl(url);return true;}});
- onPageStarted()onPageFinished():页面加载时和页面加载完毕时调用。
- shouldOverrideKeyEvent():重写此方法才能处理浏览器中的按键事件。
- shouldInterceptRequest():页面每一次请求资源之前都会调用这个方法(非UI线程调用)。
- onLoadResource():页面加载资源时调用,每加载一个资源(比如图片)就调用一次。
- onReceivedError():加载页面的服务器出现错误(比如404)时回调。
- onReceivedSslError():重写此方法可以让webview处理https请求。
- doUpdateVisitedHistory():更新历史记录。
- onFormResubmission():应用程序重新请求网页数据。
- onReceivedHttpAuthRequest():获取返回信息授权请求。
- onScaleChanged():WebView发生缩放改变时调用。
onUnhandledKeyEvent():Key事件未被加载时调用。
3.3 WebChromeClient
onProgressChanged():获得网页的加载进度并显示。onReceivedTitle():获得网页的标题时回调。onReceivedIcon():获得网页的图标时回调。onCreateWindow():打开新窗口时回调。onCloseWindow():关闭窗口时回调。onJsAlert():网页弹出提示框时触发此方法。@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result) {Toast.makeText(MainActivity.this,"Im alert",Toast.LENGTH_SHORT).show();//部分机型只会弹出一次提示框,调用此方法即可解决此问题。result.cancel();//返回true表示不弹出系统的提示框,返回false表示弹出return true;}
onJsConfirm():网页弹出确认框时触发此方法。@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result) {//confirm表示确认,cancel表示取消。result.confirm();//返回true表示不弹出系统的提示框,返回false表示弹出return true;}
onJsPrompt():网页弹出输入框时触发此方法。@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {//confirm表示确认(并返回值),cancel表示取消。result.confirm("8848");//返回true表示不弹出系统的提示框,返回false表示弹出return true;}
Cookie相关
WebView可以在需要的时候自动同步cookie,只需要获得CookManager的对象将cookie设置进去就可以了
从服务器的返回头中取出cookie根据
