一、基本介绍
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-Agent
webSettings.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。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//作用1:重定向url
if(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()
:网页弹出提示框时触发此方法。@Override
public 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()
:网页弹出确认框时触发此方法。@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
//confirm表示确认,cancel表示取消。
result.confirm();
//返回true表示不弹出系统的提示框,返回false表示弹出
return true;
}
onJsPrompt()
:网页弹出输入框时触发此方法。@Override
public 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根据