android.webkit.WebViewClient (API 24)
WebView通过该类对外通知页面加载相关的消息用来在页面加载的各个阶段进行业务处理,处理加载错误情况,拦截页面内和页面外的请求
一、常量(错误代码):
int ERROR_AUTHENTICATION : 服务器上的用户身份验证失败
int ERROR_BAD_URL : 无效的URL
int ERROR_CONNECT : 连接服务器失败
int ERROR_FAILED_SSL_HANDSHAKE : 执行SSL握手失败
int ERROR_FILE : 通用文件错误
int ERROR_FILE_NOT_FOUND : 文件未找到
int ERROR_HOST_LOOKUP : 服务器或代理服务器的主机名查找失败
int ERROR_IO : 无法读取或写入服务器
int ERROR_PROXY_AUTHENTICATION : 代理服务器上的用户身份验证失败
int ERROR_REDIRECT_LOOP : 太多的重定向
int ERROR_TIMEOUT : 连接超时
int ERROR_TOO_MANY_REQUESTS : 本次加载有太多请求
int ERROR_UNKNOWN : 通用错误
int ERROR_UNSUPPORTED_AUTH_SCHEME : 不支持的认证协议(不是基本的和摘要的?)
int ERROR_UNSUPPORTED_SCHEME : 不支持的URL协议
二、构造方法:
WebViewClient ()
三、public方法:
doUpdateVisitedHistory API 1
/**
* 通知主机应用程序更新其访问的链接数据库。
* @param view 启动这个回调的webview
* @param url 正在访问的网址
* @param isReload 如果这个url正在被重新加载就返回true
*/
void doUpdateVisitedHistory (WebView view, String url, boolean isReload){
}
onFormResubmission API 1
/**
* 如果浏览器需要重新发送POST请求,可以通过这个时机来处理。默认是不重新发送数据
* @param view 启动这个回调的webview
* @param dontResend 如果浏览器不重新发送数据时发送这个msg
* @param resend 如果浏览器重新发送数据时发送这个msg
*/
public void onFormResubmission(WebView view, Message dontResend,
Message resend) {
dontResend.sendToTarget();
}
onLoadResource API 1
/**
* 通知宿主程序webview会加载url指定的资源,每加载一个资源都会回调一次
*
* @param view 启动这个回调的webview
* @param url 将要加载的url
*/
public void onLoadResource(WebView view, String url) {
}
onPageCommitVisible API 23 (不准确)
/**
* 通知宿主应用程序webview不再绘制从上一个页面导航栏遗留下来的内容
* 这个回调可以被用来确定安全回收webview可见的时间点,确保没有显示陈旧的内容。这个方法会在保证onDraw不再绘制
* 任何来自上一个导航栏的内容的第一时间被回调。接下来将会绘制webview的背景颜色或者一些新加载的页面的内容
* 当http响应的body开始加载时、在DOM中被反射时、将要被绘制时,这个方法会被回调。这个回调在文档加载过程的早期
* 发生,因此你应该预料到链接资源(例如,css和图像)可能不可用。
* 更精细的可见状态的更新,参见postVisualStateCallback
* 请注意,所有适合postVisualStateCallback的条件和建议都适用于本方法
* 这个回调只会被主框架导航栏调用
* @param view 导航发生的时候的webview
* @param url 与触发这个回调的导航页一致的url
*/
public void onPageCommitVisible(WebView view, String url) {
}
onPageStarted API 1
/**
* 通知宿主程序一个页面开始加载了。每个主frame加载的时候这个方法都会回调,所以一个包含iframe和framesets的
* 页面只会调用一次这个方法。这同样意味着当一个内嵌的frame内容改变的时候这个方法不会回调,例如点击一个目标是
* 一个iframe的链接,它同样也不会在fragment的导航栏改变时回调。
* @param view 启动这个回调的webview.
* @param url 将要被加载的url.
* @param favicon 这个页面的标识,如果它已经存在于数据库中.
*/
public void onPageStarted(WebView view, String url, Bitmap favicon) {
}
onPageFinished API 1
/**
* 通知宿主程序一个页面加载完成。这个方法只会被主frame回调。当这个方法回调时,渲染的图片可能还没有更新。要想
* 得到新图片的通知,请使用WebView.PictureListener#onNewPicture方法
* @param view 启动这个回调的webview.
* @param url 这个页面的url.
*/
public void onPageFinished(WebView view, String url) {
}
onReceivedClientCertRequest API 21
/**
* 通知宿主程序处理一个SSL客户端证书请求。宿主程序负责显示UI(如果需要的话)和提供钥匙。有三种方式来响应:
* proceed(),cancel(),或者ignore()。对于同一个主机+端口,如果调用了proceed()或者cancel()并且没有再次
* 调用本方法的话,webview会在内存中存储这个响应。如果调用了ignore(),webview将不会存储这个响应。
* 请注意,多层chrom网络栈可能会缓存这个响应,所以唯一的好办法是ignore
* 这个方法在UI线程回调。在回调的过程中,连接会被暂停
* 大多数的情况下,应用程序都应该实现android.security.KeyChainAliasCallback接口,并且把它传递给
* KeyChain的choosePrivateKeyAlias来开启一个activity为用户选择一个正确的别名。
* 这里是一个客户端证书的示例:
* <A href="https://android.googlesource.com/platform/packages/apps/Browser/+/android-
* 5.1.1_r1/src/com/android/browser/Tab.java">AOSP Browser</a>
* 默认的行为是cancel,返回没有证书
* @param view 启动这个回调的webview.
* @param request ClientCertRequest的一个实例
*/
public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
request.cancel();
}
onReceivedError API 1
/**
* 发送一个错误给宿主程序。这些错误是不可恢复的,即主资源(?)不可用。errorCode参数对应是以ERROR_开头的常量。
* @param view 启动这个回调的webview.
* @param errorCode 以ERROR_开头的常量值.
* @param description 错误的String形式的描述.
* @param failingUrl 加载失败的url.
* @deprecated 这个方法在API 23被废弃了,用下面的重载方法替换
*/
@Deprecated
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
}
onReceivedError API 23
/**
* 发送一个Web资源加载的错误给宿主程序。这些错误通常表明无法连接到服务器。
* 注意,不同意上面的过时方法的回调,新版本的方法会在任何资源加载失败时都回调,而不仅限于主page。
* 因此,建议在本方法中执行最低要求(?)的工作。
* @param view 启动这个回调的webview.
* @param request 原始请求.
* @param error 错误发生时的错误信息.
*/
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
//如果是主frame的话就执行方法,要是在其他比如iframes就会不执行
if (request.isForMainFrame()) {
onReceivedError(view,
error.getErrorCode(), error.getDescription().toString(),
request.getUrl().toString());
}
}
onReceivedHttpAuthRequest API 1
/**
* 通知宿主程序接收到了一个HTTP认证的请求。宿主程序可以使用参数中的HttpAuthHandler来处理这个请求。
* 默认的行为是取消请求。
* @param view 启动这个回调的webview.
* @param handler 处理请求的handler
* @param host 需要认证的主机
* @param realm 需要认证的域
* @see 可以查看WebView#getHttpAuthUsernamePassword
*/
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
handler.cancel();
}
onReceivedHttpError API 23
/**
* 通知宿主程序在加载一个资源的时候从服务器接收到了一个HTTP的错误。这个错误的错误码会>=400.这个回调在任何资
* 源加载出错的时候都会回调,而不仅限于主page。因此,建议在本方法中执行最低要求(?)的工作。
* 请注意,服务器响应内容不能在errorResponse参数中设置。
* @param view 启动这个回调的webview.
* @param request 原始请求.
* @param errorResponse 错误发生时的错误信息.
*/
public void onReceivedHttpError(
WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
}
onReceivedLoginRequest API 12
/**
* 通知宿主程序自动登录用户的请求已被处理.
* @param view 请求登录的WebView.
* @param realm 用来查找账户的账户域.
* @param account 一个可选账户. 如果不是空,这个账户应该用设备上的账户来检查。如果是可用的账户,它应该被
* 用来登录用户.
* @param args 用于登录用户身份验证的具体参数.
*/
public void onReceivedLoginRequest(WebView view, String realm,
String account, String args) {
}
onReceivedSslError API 8
/**
* 通知宿主程序加载资源的时候发生了一个SSL错误。宿主程序必须调用handler.cancel()或者handler.proceed()。
* 注意,你的选择可能会被保存,用于处理接下来的SSL错误。默认的行为是取消加载-handler.cancel()
* @param view 启动这个回调的webview.
* @param handler 一个用于处理用户响应的SslErrorHandler对象
* @param error SSL错误对象
*/
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
handler.cancel();
}
onScaleChanged API 1
/**
* 通知宿主程序WebView的缩放比例发生了改变。
* @param view 启动这个回调的webview.
* @param oldScale 旧的缩放比例
* @param newScale 新的缩放比例
*/
public void onScaleChanged(WebView view, float oldScale, float newScale) {
}
onTooManyRedirects API 1
/**
* 通知宿主程序存在大量的HTTP重定向。宿主程序如果想继续加载资源的话可以选择发送继续的msg,默认的是发送取消的
* msg
* @param view 启动这个回调的webview.
* @param cancelMsg 用来取消的msg
* @param continueMsg 用来继续的msg
* @deprecated 这个方法在API 8的时候被废弃。当webview遇到一个循环的重定向操作,它会取消加载
*/
@Deprecated
public void onTooManyRedirects(WebView view, Message cancelMsg,
Message continueMsg) {
cancelMsg.sendToTarget();
}
onUnhandledKeyEvent API 1
/**
* 通知宿主程序有按键事件没有被webview处理。除非是系统的按键事件,webview会消费正常流程的按键事件和
* shouldOverrideKeyEvent方法返回true的按键事件。在事件被分发的时候这个方法会被异步调用。这给了宿主程序一
* 个机会去处理那些没有处理的按键事件。
* @param view 启动这个回调的webview.
* @param event 按键事件.
*/
public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
onUnhandledInputEventInternal(view, event);
}
shouldInterceptRequest API 11
/**
* 通知宿主程序资源请求和允许程序返回数据。如果返回值是空,webview会继续正常加载资源。否则将使用返回的响应和
* 数据。
* 注意:这个方法会在非UI线程回调,所以客户端在访问私有数据或者view的时候应该谨慎
* @param view 正在请求资源的WebView.
* @param url 资源的未经加工过的url.
* @return 一个包含响应信息或者null(如果webview要加载资源本身)的WebResourceResponse
* @deprecated API 21的时候被废弃,请使用下面的重载方法代替
*/
@Deprecated
public WebResourceResponse shouldInterceptRequest(WebView view,
String url) {
return null;
}
shouldInterceptRequest API 21
/**
* 通知宿主程序资源请求和允许程序返回数据。如果返回值是空,webview会继续正常加载资源。否则将使用返回的响应
* 和数据。
* @param view 正在请求资源的WebView.
* @param request 包含请求详细信息的对象.
* @return 一个包含响应信息或者null(如果webview要加载资源本身)的WebResourceResponse
*/
public WebResourceResponse shouldInterceptRequest(WebView view,
WebResourceRequest request) {
return shouldInterceptRequest(view, request.getUrl().toString());
}
shouldOverrideKeyEvent API 1
/**
* 给宿主程序一个同步处理按键事件的机会。例如,菜单快捷按键就需要这种方式来过滤。如果返回true,webview将不会
* 处理按键事件。如果返回false,webview总是会处理按键事件,所以视图链中将没有父视图可以看到按键事件。默认行为
* 是返回false(webview将会消耗按键事件)
* @param view 启动这个回调的webview.
* @param event 这个按键事件.
* @return 如果宿主程序想自己处理这个事件就返回true,否则返回false
*/
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
return false;
}
shouldOverrideUrlLoading API 1
/**
* 当一个新的url将要被加载到当前的webview上时给宿主程序一个机会去接管控制。如果没有提供webviewClient,默认
* 情况下webview会询问ActivityManager去选择适当的处理程序。如果提供了webviewClient,返回true意味着宿主程
* 序要处理这个url,否则意味着当前webview去处理这个url
* @param view 启动这个回调的webview.
* @param url 将要被加载的url
* @return 如果宿主程序想要离开当前的webview并且自己处理这个url就返回tre,否则就返回false。
* 在API 24被废弃,请使用下面的重载方法代替
*/
@Deprecated
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
shouldOverrideUrlLoading API 24
/**
* 当一个新的url将要被加载到当前的webview上时给宿主程序一个机会去接管控制。如果没有提供webviewClient,默认
* 情况下webview会询问ActivityManager去选择适当的处理程序。如果提供了webviewClient,返回true意味着宿主程
* 序要处理这个url,否则意味着当前webview去处理这个url。
* 注意:
* 使用POST方法的请求将不会触发这个回调
* 没有http scheme的子frame将不会触发这个回调,因此强烈建议不要无条件地在方法里面用请求的url来调用
* webview.loadUrl(String),然后返回一个true,因为这会让webview尝试加载一个非Http的url,然后就会失败
* @param view 启动这个回调的webview.
* @param request 包含请求详细信息的Object.
* @return 如果宿主程序想要离开当前的webview并且自己处理这个url就返回tre,否则就返回false.
*/
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.getUrl().toString());
}