#.简介:
WebView是Android提供的用来展示展示web页面的View,内部使用webkit浏览器引擎(一个轻量级的浏览器引擎),除了展示Web页面外,还可与Web页面内的JS脚本交互调用。
#一、WebView常用方法
1.加载Url或资源的方法
webView.loadUrl("百度一下,你就知道");
webView.loadUrl("file:///xxx/xxx/test.html");
loadData(String data, String mimeType, String encoding);
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl));
2.生命周期相关方法
rootLayout.removeView(webView);
3.页面前进、后退
webview.goBackOrForward(steps);
4.事件拦截
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) {
return super.onKeyDown(keyCode, event);
public boolean onKeyUp(int keyCode, KeyEvent event) {
return super.onKeyUp(keyCode, event);
5.设置回调接口
webView.setDownloadListener(new DownloadListener() {
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
6.其它方法
webView.clearCache(true);
#二、常用的辅助类:WebSetting/WebViewClient/ChromeWebviewClient
WebView内部的WebSetting对象负责管理WebView的参数配置;
WebViewClient负责处理WebView的各种请求和通知事件,在对应事件发生时会执行WebViewClient的对应回调;
ChromeWebviewClient
辅助Webview处理与JS一些交互功能,主要是提供一些标准的回调方法,当JS调用相关方法时会触发对应回调。
##1. 通过WebSetting设置参数
WebView内部的WebSetting对象负责管理WebView的配置,WebSetting提供了一系列方法来供开发者来做配置。
以下将这些参数分为了三大类:显示相关的、缓存和存储相关的、其它相关,在下面代码和注释中详细列举出了。
其中
缓存模式,一共可设置四种:
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
WebSettings webSettings = getSettings();
if (null != webSettings) {
webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(true);
webSettings.setSupportZoom(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
webSettings.setLoadsImagesAutomatically(true);
webSettings.setSupportMultipleWindows(false);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webSettings.setAppCacheEnabled(true);
webSettings.setAppCachePath(getContext().getDir("appcache", 0).getPath());
webSettings.setAppCacheMaxSize(Long.MAX_VALUE);
webSettings.setDatabaseEnabled(true);
webSettings.setDatabasePath(getContext().getDir("databases", 0).getPath());
webSettings.setAllowFileAccess(true);
webSettings.setDomStorageEnabled(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
if (Build.VERSION.SDK_INT >= 21) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
webSettings.setDefaultTextEncodingName("utf-8");
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSettings.setGeolocationEnabled(true);
webSettings.setGeolocationDatabasePath(getContext().getDir("geolocation", 0).getPath());
webSettings.setUserAgentString(webSettings.getUserAgentString() + DeviceUtils.getUserAgent());

##2.设置WebViewClient
WebViewClient负责处理WebView的各种请求和通知事件,在对应事件发生时会执行WebViewClient的对应回调。例如URL加载重定向、网页开始加载/加载完毕、各种错误通知等。
常用方法与接收,见以下代码示例与注释。
public boolean shouldOverrideUrlLoading(WebView view, String url) {
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
if (!TextUtils.isEmpty(url)) {
super.onReceivedSslError(view, handler, error);

##3.ChromeWebviewClient
辅助Webview处理与JS一些交互功能,主要是提供一些标准的回调方法,当JS调用相关方法时会触发对应回调。
除此之外,还可以获取网页加载进度和网页标题等。
一些API方法示例:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
if (!TextUtils.isEmpty(url)) {
super.onReceivedSslError(view, handler, error);

##4. Cookie相关设置
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
if (Build.VERSION.SDK_INT < 21) {
CookieSyncManager.getInstance().sync();
CookieManager.getInstance().flush();
#三、WebView中Java与JS交互的几种方式
#1. Java调用JS
##方法1:使用Webview.loadUrl(“javaScript:【方法名和参数对应的字符串】”);
注:该方法会导致页面刷新
示例:
mWebView.loadUrl(
“javascript:callJS()”
);
mWebView.loadUrl(
“javascript:callJS("+ 【参数变量】 +")”
);
##方法2:使用Webview.evaluateJavaScript(“javaScript:【方法名和参数对应的字符串】”);
注:1.该方法不会导致页面刷新 2.Android4.4之后才能使用该API方法
示例:
//注:在
ValueCallback<String>泛型中的参数类型表明JS函数返回值的类型,该示例中为String类型
mWebView.evaluateJavascript(
"javascript:callJS()"
,
new
ValueCallback<String>() {
@Override
public
void
onReceiveValue
(String
value
) {
//此处为 js 返回的结果
}
});
#2. JS调用Java
##方法1:通过WebView.addJavascriptInterface(【包含JS接口的Java对象】, 【在JS中的对象名称】);
在JavaScript中映射一个Java对象,该对象包含了各种需要被调用的方法。
使用步骤:
1).声明一个Java类,通过
@JavascriptInterface注解来创建各个需要被JS调用的方法
2).通过
WebView.addJavascriptInterface(
【Java对象】
,
“【JS中的对象名称】”
)将一个上述Java类对象与 JavaScript中对应名称的对象 建立映射关系
3).在JS中通过指定名称对象调用相关方法,等于调用被映射的Java对象的方法
示例:
public class JSInterface{
public void pay(final String json) {
public String getToken() {
JSInterface jsInterface = new JSInterface();
addJavascriptInterface(jsInterface, "javaObj");
#方法2:通过在JS中加载url, 触发WebView.shouldOverrideUrlLoadding(WebView view,String url)方法,从而在该方法中根据加载的url字符串做相应的逻辑处理。
使用步骤:
1)当JS中进行url加载时,Android中WebViewClient 的回调方法shouldOverrideUrlLoading()会被触发,拦截相应url
2)在shouldOverrideUrlLoading()对拦截的url做解析,执行需要执行的对应逻辑。
#方法3:通过在JS中执行各种弹窗操作,来触发WebChromeClient的相应拦截方法,在回调方法中执行需要的逻辑。(不推荐该方式,因为这些回调方法在设计上讲,本来不是做这种用途的。
(其思路与方法2相似,也是通过JS中的操作来触发Java中的回调方法,从而在Java回调方法中执行需要执行的逻辑。只不过方法2是通过加载url,来触发WebViewClient的shouldOverrideUrlLoadding()方法;而方法3是通过各种弹窗操作,来触发WebChromeClient的各种回调方法。)
使用步骤,与方法2类似:
1.在JS中调用弹窗,触发WebChromeClient的相应拦截方法
2.在Java拦截方法中,通过解析传入的字符参数,来执行相应的逻辑。
JS中常用的弹窗方法由三种: alert()、confirm()、prompt()
在WebChromeClient中对应触发的拦截方法为:onJsAlert()、onJsConfirm()、onJsPrompt