目录
3.3 WebViewClient
3.3.1shouldOverrideUrlLoading(重定向时回调)
3.3.2 onPageStarted(开始加载网络)
3.3.3 onPageFinished(网页加载完成回调)
3.3.4 onLoadResoure(加载Url资源回调)
3.3.5 shoudIdInterceptRequest
3.3.6 onReceivedError(访问地址错误回调)
3.3.7 onFormResubm(post请求)
3.3.8 doUpdateVisitedHistory(更新数据库)
3.3.9 onReceivedSsslError(加载SSL错误回调)
3.3.10 onReceivedHttpAuthRequest(auth请求回调)
3.3.11 shouldOverrideKeyEvent(按键处理回调)
3.3.12onScaleChanged(WebView比例改变)
3.3.13 onReceivedLoginRequest(账户自动登录)
WebViewClient主要帮助WebView处理各种通知、请求事件;
加载网页需要重定向的时候回调
public boolean shouldOverrideUrlLoading(WebView view, String url) {}
/**
* shouldOverrideUrlLoading
*
* 当加载的网页需要重定向的时候就会回调这个函数告知我们应用程序是否需要接管控制网页加载,如果应用程序接管,
*并且return true意味着主程序接管网页加载,如果返回false让webview自己处理。
*
* 参数说明:
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param url
* 即将要被加载的url
* @return true 当前应用程序要自己处理这个url, 返回false则不处理。 注:"post"请求方式不会调用这个回调函数
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
Log.i(TAG, url + "===");
if (Uri.parse(url).getHost().equals("www.baidu.com")) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
return true;
}
return false;
}
/**
* onPageStarted 当内核开始加载访问的url时,会通知应用程序,对每个main frame
* 这个函数只会被调用一次,页面包含iframe或者framesets 不会另外调用一次onPageStarted,
* 当网页内内嵌的frame 发生改变时也不会调用onPageStarted。
*
* 参数说明:
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param url
* 即将要被加载的url
* @param favicon
* 如果这个favicon已经存储在本地数据库中,则会返回这个网页的favicon,否则返回为null。
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
Log.i(TAG, "onPageStarted:页面开始加载");
}
/**
* onPageFinished 当内核加载完当前页面时会通知我们的应用程序,这个函数只有在main
* frame情况下才会被调用,当调用这个函数之后,渲染的图片不会被更新,如果需要获得新图片的通知可以使用@link
* WebView.PictureListener#onNewPicture。 参数说明:
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param url
* 即将要被加载的url
*/
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
Log.i(TAG, "onPageStarted:页面加载结束");
}
/**
* onLoadResource 通知应用程序WebView即将加载url 制定的资源
*
* 参数说明:
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param url
* 即将加载的url 资源
*/
@Override
public void onLoadResource(WebView view, String url) {
// TODO Auto-generated method stub
super.onLoadResource(view, url);
Log.i(TAG, "onLoadResource:加载资源指定的网址");
}
/**
* shouldInterceptRequest
* 通知应用程序内核即将加载url制定的资源,应用程序可以返回本地的资源提供给内核,若本地处理返回数据,内核不从网络上获取数据。
*
* 参数说明:
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param url
* raw url 制定的资源
* @return 返回WebResourceResponse包含数据对象,或者返回null
*/
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
// TODO Auto-generated method stub
Log.i(TAG, "shouldInterceptRequest");
return super.shouldInterceptRequest(view, url);
}
/**
* onReceivedError
*
* 当浏览器访问制定的网址发生错误时会通知我们应用程序 参数说明:
*
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param errorCode
* 错误号可以在WebViewClient.ERROR_* 里面找到对应的错误名称。
* @param description
* 描述错误的信息
* @param failingUrl
* 当前访问失败的url,注意并不一定是我们主url
*/
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// TODO Auto-generated method stub
super.onReceivedError(view, errorCode, description, failingUrl);
view.loadUrl("file:///android_asset/error.html");
Log.i(TAG, "onReceivedError");
}
/**
* 如果浏览器需要重新发送POST请求,可以通过这个时机来处理。默认是不重新发送数据。 参数说明
*
* @param view
* 接收WebViewClient的webview
* @param dontResend
* 浏览器不需要重新发送的参数
* @param resend
* 浏览器需要重新发送的参数
*/
@Override
public void onFormResubmission(WebView view, Message dontResend,
Message resend) {
// TODO Auto-generated method stub
super.onFormResubmission(view, dontResend, resend);
Log.i(TAG, "onFormResubmission");
}
/**
* doUpdateVisitedHistory
* 通知应用程序可以将当前的url存储在数据库中,意味着当前的访问url已经生效并被记录在内核当中。这个函数在网页加载过程中只会被调用一次。
* 注意网页前进后退并不会回调这个函数。
*
* 参数说明:
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param url
* 当前正在访问的url
* @param isReload
* 如果是true 这个是正在被reload的url
*/
@Override
public void doUpdateVisitedHistory(WebView view, String url,
boolean isReload) {
// TODO Auto-generated method stub
super.doUpdateVisitedHistory(view, url, isReload);
Log.i(TAG, "doUpdateVisitedHistory");
}
/**
* 当网页加载资源过程中发现SSL错误会调用此方法。我们应用程序必须做出响应,是取消请求handler.cancel(),还是继续请求handler.
* proceed();内核的默认行为是handler.cancel();
*
* 参数说明:
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param handler
* 处理用户请求的对象。
* @param error
* SSL错误对象
*
*/
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
// view.loadUrl("file:///android_asset/error.html");
// TODO Auto-generated method stub
super.onReceivedSslError(view, handler, error);
Log.i(TAG, "onReceivedSslError");
}
/**
* onReceivedHttpAuthRequest 通知应用程序WebView接收到了一个Http
* auth的请求,应用程序可以使用supplied 设置webview的响应请求。默认行为是cancel 本次请求。
*
*
* 参数说明:
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param handler
* 用来响应WebView请求的对象
* @param host
* 请求认证的host
* @param realm
* 认真请求所在的域
*/
@Override
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
// TODO Auto-generated method stub
super.onReceivedHttpAuthRequest(view, handler, host, realm);
Log.i(TAG, "onReceivedHttpAuthRequest");
}
/**
* shouldOverrideKeyEvent
* 提供应用程序同步一个处理按键事件的机会,菜单快捷键需要被过滤掉。如果返回true,webview不处理该事件,如果返回false,
* webview会一直处理这个事件,因此在view 链上没有一个父类可以响应到这个事件。默认行为是return false;
*
*
* 参数说明:
*
* @param view
* 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new
* MyAndroidWebViewClient()),即是这个webview。
* @param event
* 键盘事件名
* @return 如果返回true,应用程序处理该时间,返回false 交有webview处理。
*/
@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
Log.i(TAG, "shouldOverrideKeyEvent");
// TODO Auto-generated method stub
return super.shouldOverrideKeyEvent(view, event);
}
/**
* 通知应用程序webview 要被scale。应用程序可以处理改事件,比如调整适配屏幕。
*/
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
// TODO Auto-generated method stub
super.onScaleChanged(view, oldScale, newScale);
Log.i(TAG, "onScaleChanged");
}
/**
* onReceivedLoginRequest 通知应用程序有个自动登录的帐号过程
*
* 参数说明:
*
* @param view
* 请求登陆的webview
* @param realm
* 账户的域名,用来查找账户。
* @param account
* 一个可选的账户,如果是null 需要和本地的账户进行check, 如果是一个可用的账户,则提供登录。
* @param args
* 验证制定参数的登录用户
*/
@Override
public void onReceivedLoginRequest(WebView view, String realm,
String account, String args) {
// TODO Auto-generated method stub
super.onReceivedLoginRequest(view, realm, account, args);
Log.i(TAG, "onReceivedLoginRequest");
}