前言

WebView用于在Android中加载H5界面的组件

使用介绍

一般来说Webview可单独使用,可联合其子类一起使用所以接下来,我会介绍:
Webview自身的常见方法;
Webview的最常用的子类 :WebSettings类、WebViewClient类、WebChromeClient类
Android和Js的交互

Webview常用方法
//激活Webview为活跃状态,能正常执行网页响应
webView.onResume();
//当页面失去焦点被切换到后台不可见状态需要执行onPause
//通过该方法通知内核暂停所有的动作,比如DOM的解析、plugin的执行和JavaScript执行等
webView.onPause();
//当应用程序(存在webView)被切换到后台时,这个方法不仅仅针对当前的webView而是全局的全应用程序的webView
//它会暂停所有的webView的layout、parsing、javascripttimer降低cpu的功耗
webView.pauseTimers();
//恢复pauseTimers状态
webView.resumeTimers();

//销毁webView
//在关闭了Activity时,如果webView的音乐或视频还在播放就必须销毁webView,但是注意:webView调用destory时,webView仍绑定在Activity上,这是由于自定义webView构建时传入了该Activity的context对象,因此需要先从父容器中移除webView,然后再销毁webView
rootLayout.removeView(webView);
webView.destroy();

//是否可以后退
webView.canGoBack();
//后退网页
webView..goBack();
//是否可以前进
webView.canGoForward();
//前进网页
webView.goForward();

//以当前的index为起始点前进或者后退到历史记录中指定的steps,如果steps为负数则为后退,正数则为前进
webView.goBackOrForward(intsteps);

常见用法:Back键控制网页后退

问题:在不做任何处理前提下 ,浏览网页时点击系统的“Back”键,整个 Browser 会调用 finish()而结束自身

目标:点击返回后,是网页回退而不是推出浏览器

解决方案:在当前Activity中处理并消费掉该 Back 事件

h5 关闭ios视频窗口_h5 关闭ios视频窗口


h5 关闭ios视频窗口_h5 关闭ios视频窗口_02


清楚缓存

h5 关闭ios视频窗口_html_03

WebSettings类

作用:对WebView进行配置和管理

配置步骤 & 常见方法:

配置步骤1:添加访问网络权限(AndroidManifest.xml)

h5 关闭ios视频窗口_h5 关闭ios视频窗口_04


配置步骤2:生成一个WebView组件(有两种方式)

h5 关闭ios视频窗口_h5 关闭ios视频窗口_05


配置步骤3:进行配置-利用WebSettings子类(常见方法)

h5 关闭ios视频窗口_webview_06


常见用法:设置WebView缓存

当加载 html 页面时,WebView会在/data/data/包名目录下生成 database 与 cache 两个文件夹

请求的 URL记录保存在 WebViewCache.db,而 URL的内容是保存在 WebViewCache 文件夹下

是否启用缓存:

h5 关闭ios视频窗口_h5 关闭ios视频窗口_07


结合使用(离线加载)

h5 关闭ios视频窗口_html_08

WebViewClient类

作用:处理各种通知 & 请求事件

shouldOverrideUrlLoading()

作用:打开网页时不调用系统浏览器, 而是在本WebView中显示;在网页上的所有加载都经过这个方法,这个函数我们可以做很多操作。

h5 关闭ios视频窗口_webview_09


onPageStarted()

作用:开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应。

h5 关闭ios视频窗口_h5 关闭ios视频窗口_10


onPageFinished()

作用:在页面加载结束时调用。我们可以关闭loading 条,切换程序动作。

h5 关闭ios视频窗口_h5 关闭ios视频窗口_11


onLoadResource()

作用:在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。

h5 关闭ios视频窗口_加载_12


onReceivedError()

作用:加载页面的服务器出现错误时(如404)调用。

h5 关闭ios视频窗口_webview_13


onReceivedSslError()

作用:处理https请求

webView默认是不处理https请求的,页面显示空白,需要进行如下设置:

h5 关闭ios视频窗口_h5 关闭ios视频窗口_14

WebChromeClient类

作用:辅助 WebView 处理 Javascript 的对话框,网站图标,网站标题等等。

常见使用

onProgressChanged()

作用:获得网页的加载进度并显示

h5 关闭ios视频窗口_h5 关闭ios视频窗口_15


onReceivedTitle()

作用:获取Web页中的标题

每个网页的页面都有一个标题,比如www.baidu.com这个页面的标题即“百度一下,你就知道”,那么如何知道当前webview正在加载的页面的title并进行设置呢?

h5 关闭ios视频窗口_webview_16


注意事项:如何避免WebView内存泄露?

不在xml中定义 Webview ,而是在需要的时候在Activity中创建,并且Context使用

getApplicationgContext()
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mWebView = new WebView(getApplicationContext());
mWebView.setLayoutParams(params);
mLayout.addView(mWebView);

在 Activity 销毁( WebView )的时候,先让 WebView 加载null内容,然后移除 WebView,再销毁 WebView,最后置空。

h5 关闭ios视频窗口_html_17

WebViewClient与WebChromeClient区别

使用WebView基本都会使用这两个类,那他们有哪些区别呢?
WebViewClient主要帮助WebView处理各种通知、请求事件的,有以下常用方法:

  • onPageFinished 页面请求完成
  • onPageStarted 页面开始加载
  • shouldOverrideUrlLoading 拦截url
  • onReceivedError 访问错误时回调,例如访问网页时报错404,在这个方法回调的时候可以加载错误页面。

WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等,有以下常用方法。

  • onJsAlert webview不支持js的alert弹窗,需要自己监听然后通过dialog弹窗
  • onReceivedTitle 获取网页标题
  • onReceivedIcon 获取网页icon
  • onProgressChanged 加载进度回调

加载html四种方式

//方式1:加载Url
webView.loadUrl("http://139.196.35.30:8080/OkHttpTest/apppackage/test.html");

//方式2:加载asset文件夹下html
webView.loadUrl("file:///android_asset/test.html");

//方式3:加载手机sdcard上的html页面
webView.loadUrl("content://com.ansen.webview/sdcard/test.html");

//方式4 使用webview显示html代码
webView.loadDataWithBaseURL(null,"<html><head><title> 欢迎您 </title></head>" +"<body><h2>使用webview显示 html代码</h2></body></html>", "text/html" , "utf-8", null);