一、基本介绍

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);

  1. <a name="HxOtm"></a>
  2. #### 2.2 WebView的状态
  3. ```java
  4. // 激活WebView为活跃状态,能正常执行网页的响应
  5. webView.onResume();
  6. // 当页面被失去焦点被切换到后台不可见状态,需要执行onPause,
  7. // 通过onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。
  8. webView.onPause();
  9. // 当应用程序(存在webview)被切换到后台时,这个方法不仅仅针对当前的webview而是全局的全应用程序的webView
  10. // 它会暂停所有webview的layout、parsing、javascripttimer。降低CPU功耗
  11. webView.pauseTimers();
  12. // 恢复pauseTimes状态
  13. webView.resumeTimers();
  14. LinearLayout ll = findViewById(R.id.ll);
  15. ll.removeView(webView);
  16. webView.destroy();

2.3 页面切换

  1. // 上一页
  2. webView.goBack();
  3. // 下一页
  4. webView.goForawrd();

2.4 清除缓存

  1. // 清除页面访问留下的缓存,这个方法将清空整改应用程序的WebView缓存。
  2. webView.clearCache(true);
  3. // 清除低昂钱正在访问的页面外所有的访问历史记录
  4. webView.clearHistory();
  5. // 清除自动完成填表的表单数据,不会清除webView存储在本地的数据
  6. webView.clearFormData();

3. 常用工具类

3.1 WebSettings

  1. // 获取WebSetting子类
  2. var webSettings = webView.settings
  3. // 支持JavaScript交互
  4. webSettings.javaScriptEnable = true
  5. // 支持flash插件
  6. webSetting.pluginState = WebSettings.PluginState.OFF
  7. // 设置自适应屏幕
  8. webSettings.setUserWideViewPort(true) // 将图片调整到适合WebView的大小
  9. webSettings.setLoadWithOveriewMode(true) // 缩放至屏幕大小
  10. webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
  11. // 缩放操作
  12. webSettings.setSupportZoom(true) // 支持缩放,默认true,是下面设置的前提
  13. webSetting.setBuiltInZoomContrals(true) // 设置内置的缩放空间,若为false,则该WebView不可以缩放
  14. webSettings.setDisplayZoomContrals(false) // 隐藏原生的缩放控件
  15. webSettings.setTextZoom(2);//设置文本的缩放倍数,默认为 100
  16. // 关闭WebView中缓存
  17. webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
  18. // 设置可以访问文件
  19. webSettings.allowFileAccess = true
  20. // 支持通过JS打开新窗口
  21. webSettings.javaScriptCanOpenWindowsAutomatically = true
  22. // 支持自动加载图片
  23. webSettings.loadsImagesAutomatically = true
  24. // 设置编码格式
  25. webSettings.defaultTextEncodingName = "UTF-8"
  26. // 5.1以上默认禁止了https和http混用,以下方式是开启
  27. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  28. webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
  29. }
  30. //设置User-Agent
  31. webSettings.setUserAgentString("Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0");
  32. //允许网页执行定位操作
  33. webSettings.setGeolocationEnabled(true);

WebView设置缓存,当加载 html 页面时,WebView会在/data/data/package/下生成 database 与 cache 两个文件夹
请求的URL记录保存在WebViewCache.db,而URL的内容是保存在WebViewCache文件夹下:

  1. //缓存模式如下:
  2. //LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
  3. //LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
  4. //LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
  5. //LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
  6. //优先使用缓存:
  7. webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
  8. //不使用缓存:
  9. webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE)

还有如下几种:

  1. //开启 DOM storage API 功能 较大存储空间,使用简单
  2. settings.setDomStorageEnabled(true);
  3. //设置数据库缓存路径 存储管理复杂数据 方便对数据进行增加、删除、修改、查询 不推荐使用
  4. settings.setDatabaseEnabled(true);
  5. final String dbPath = context.getApplicationContext().getDir("db", Context.MODE_PRIVATE).getPath();
  6. settings.setDatabasePath(dbPath);
  7. //开启 Application Caches 功能 方便构建离线APP 不推荐使用
  8. settings.setAppCacheEnabled(true);
  9. final String cachePath = context.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
  10. settings.setAppCachePath(cachePath);
  11. 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的方式加载页面,此方法不会被调用。

  1. webView.setWebViewClient(new WebViewClient(){
  2. //重定向URL请求,返回true表示拦截此url,返回false表示不拦截此url。
  3. @Override
  4. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  5. //作用1:重定向url
  6. if(url.startsWith("weixin://")){
  7. url = url.replace("weixin://","http://");
  8. webView.loadUrl(url);
  9. }
  10. //作用2:在本页面的WebView打开,防止外部浏览器打开此链接
  11. view.loadUrl(url);
  12. return true;
  13. }
  14. });
  • 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():网页弹出提示框时触发此方法。

    1. @Override
    2. public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
    3. Toast.makeText(MainActivity.this,"Im alert",Toast.LENGTH_SHORT).show();
    4. //部分机型只会弹出一次提示框,调用此方法即可解决此问题。
    5. result.cancel();
    6. //返回true表示不弹出系统的提示框,返回false表示弹出
    7. return true;
    8. }
  • onJsConfirm():网页弹出确认框时触发此方法。

    1. @Override
    2. public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
    3. //confirm表示确认,cancel表示取消。
    4. result.confirm();
    5. //返回true表示不弹出系统的提示框,返回false表示弹出
    6. return true;
    7. }
  • onJsPrompt():网页弹出输入框时触发此方法。

    1. @Override
    2. public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
    3. //confirm表示确认(并返回值),cancel表示取消。
    4. result.confirm("8848");
    5. //返回true表示不弹出系统的提示框,返回false表示弹出
    6. return true;
    7. }

Cookie相关

WebView可以在需要的时候自动同步cookie,只需要获得CookManager的对象将cookie设置进去就可以了

从服务器的返回头中取出cookie根据