转载请注明出处 https://blog.csdn.net/typename/article/details/39495409 powered by meichal zhao
概览:
Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页加载过程中做应用程序想处理的事情。比如说客户端需要显示网页加载的进度、网页加载发生错误等等事件。 WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者可以继承这两个类,接手相应事件处理。WebViewClient 主要提供网页加载各个阶段的通知,比如网页开始加载onPageStarted,网页结束加载onPageFinished等;WebChromeClient主要提供网页加载过程中提供的数据内容,比如返回网页的title,favicon等。
1.WebViewClient的基本使用
创建WebViewClient实例并设置到WebView对象中,具体代码参考如下:
1
2
3
4
5
6
7
8
9
10
|
class
MyAndroidWebViewClient
extends
WebViewClient {
@Override
public
void
onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO
}
@Override
public
void
onPageFinished(WebView view, String url) {
// TODO
}
|
1
2
|
}
webview.setWebViewClient(
new
MyAndroidWebViewClient ());
|
2.WebViewClient API详解
1)网页加载时机部分
1
|
public
boolean
shouldOverrideUrlLoading(WebView view, String url)
|
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param url 即将要被加载的url@return true 当前应用程序要自己处理这个url, 返回false则不处理。
Tips(1) 当请求的方式是"POST"方式时这个回调是不会通知的。(2) 当我们访问的地址需要我们应用程序自己处理的时候,可以在这里截获,比如我们发现跳转到的是一个market的链接,那么我们可以直接跳转到应用市场,或者其他app。
1
|
public
void
onPageStarted(WebView view, String url, Bitmap favicon)
|
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param url 即将要被加载的url@param favicon 如果这个favicon已经存储在本地 数据库 中,则会返回这个网页的favicon,否则返回为null。
Tips:(1) iframe 可能不少人不知道什么含义,这里我解释下,iframe 我们加载的一张,下面有很多链接,我们随便点击一个链接是即当前host的一个iframe.(2) 有个问题可能是开发者困惑的,onPageStarted和shouldOverrideUrlLoading 在网页加载过程中这两个函数到底哪个先被调用。 当我们通过loadUrl的方式重新加载一个网址时候,这时候会先调用onPageStarted再调用shouldOverrideUrlLoading,当我们在打开的这个网址点击一个link,这时候会先调用shouldOverrideUrlLoading 再调用onPageStarted。不过shouldOverrideUrlLoading不一定每次都被调用,只有需要的时候才会被调用。
1
|
public
void
onPageFinished(WebView view, String url)
|
当内核加载完当前页面时会通知我们的应用程序,这个函数只有在main frame情况下才会被调用,当调用这个函数之后,渲染的图片不会被更新,如果需要获得新图片的通知可以使用@link WebView.PictureListener#onNewPicture。
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param url 即将要被加载的url
1
|
public
void
onLoadResource(WebView view, String url)
|
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param url 即将加载的url 资源
1
2
|
public
WebResourceResponse shouldInterceptRequest(WebView view,
String url)
|
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param url raw url 制定的资源@return 返回WebResourceResponse包含数据对象,或者返回null
Tips这个回调并不一定在UI线程执行,所以我们需要注意在这里操作View或者私有数据相关的动作。如果我们需要改变网页的背景,或者需要实现网页页面颜色定制化的需求,可以在这个回调时机处理。
1
2
|
public
void
onReceivedError(WebView view,
int
errorCode,
String description, String failingUrl)
|
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param errorCode 错误号可以在WebViewClient.ERROR_* 里面找到对应的错误名称。@param description 描述错误的信息@param failingUrl 当前访问失败的url,注意并不一定是我们主url
Tips在onReceiveError我们可以自定义网页的错误页面。
1
2
|
public
void
onFormResubmission(WebView view, Message dontResend,
Message resend)
|
1
2
|
public
void
doUpdateVisitedHistory(WebView view, String url,
boolean
isReload)
|
通知应用程序可以将当前的url存储在数据库中,意味着当前的访问url已经生效并被记录在内核当中。这个函数在网页加载过程中只会被调用一次。注意网页前进后退并不会回调这个函数。
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param url 当前正在访问的url @ param isReload 如果是true 这个是正在被reload的url
1
2
|
public
void
onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error)
|
当网页加载资源过程中发现SSL错误会调用此方法。我们应用程序必须做出响应,是取消请求handler.cancel(),还是继续请求handler.proceed();内核的默认行为是handler.cancel();
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param handler 处理用户请求的对象。@param error SSL错误对象
Tips内核会记住本次选择,如果下次还有相同的错误,内核会直接执行之前选择的结果。
1
2
|
public
void
onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm)
|
通知应用程序WebView接收到了一个Http auth的请求,应用程序可以使用supplied 设置webview的响应请求。默认行为是cancel 本次请求。参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param handler 用来响应WebView请求的对象@param host 请求认证的host@param realm 认真请求所在的域
1
|
public
boolean
shouldOverrideKeyEvent(WebView view, KeyEvent event)
|
1
|
public
void
onScaleChanged(WebView view,
float
oldScale,
float
newScale)
|
1
2
|
public
void
onReceivedLoginRequest(WebView view, String realm,
String account, String args)
|
通知应用程序有个自动登录的帐号过程参数说明:@param view 请求登陆的webview@param realm 账户的域名,用来查找账户。@param account 一个可选的账户,如果是null 需要和本地的账户进行check, 如果是一个可用的账户,则提供登录。@param args 验证制定参数的登录用户
3.WebChromeClient 基本使用
4. WebChromeClient API详解
创建WebChromeClient实例并设置到WebView对象中,具体代码参考如下:
1
|
public
void
onProgressChanged(WebView view,
int
newProgress)
|
1
|
public
void
onReceivedTitle(WebView view, String title)
|
当document 的title变化时,会通知应用程序参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param title document新的titleTips这个函数调用时机不确定,有可能很早,有可能很晚,取决于网页把title设置在什么位置,大多数网页一般把title设置到页面的前面,因此很多情况会比较早回调到这个函数。
1
|
public
void
onReceivedIcon(WebView view, Bitmap icon)
|
当前页面有个新的favicon时候,会回调这个函数。
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param icon 当前页面的favicon
1
2
|
public
void
onReceivedTouchIconUrl(WebView view, String url,
boolean
precomposed)
|
通知应用程序 apple-touch-icon的 url
参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。@param url apple-touch-icon 的服务端地址@param precomposed 如果precomposed 是true 则touch-icon是预先创建的Tips 如果应用程序需要这个icon的话, 可以通过这个url获取得到 icon。
1
|
public
void
onShowCustomView(View view, CustomViewCallback callback)
|
通知应用程序webview需要显示一个custom view,主要是用在视频全屏HTML5Video support。参数说明:@param view 即将要显示的view@param callback 当view 需要dismiss 则使用这个对象进行回调通知。
1
|
public
void
onHideCustomView()
|
1
2
|
public
boolean
onCreateWindow(WebView view,
boolean
isDialog,
boolean
isUserGesture, Message resultMsg)
|
1
2
3
4
5
6
7
|
private
void
createWindow(
final
Message msg) {
WebView.WebViewTransport transport = (WebView.WebViewTransport) msg.obj;
final
Tab newTab = mWebViewController.openTab(
null
, Tab.
this
,
true
,
true
);
transport.setWebView(newTab.getWebView());
msg.sendToTarget();
}
|
1
|
public
void
onRequestFocus(WebView view)
|
1
|
public
void
onCloseWindow(WebView window)
|
通知应用程序从关闭传递过来的webview并从view tree中remove。
1
2
|
public
boolean
onJsAlert(WebView view, String url, String message,
JsResult result)
|
通知应用程序显示javascript alert对话框,如果应用程序返回true内核认为应用程序处理这个消息,返回false,内核自己处理。参数说明:@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 当前请求弹出javascript 对话框webview 加载的url地址。@param message 弹出的内容信息@result 用来响应用户的处理。
Tips如果我们应用接管处理, 则必须给出result的结果,result.cancel,result.comfirm必须调用其中之后,否则内核会hang住。
1
2
|
public
boolean
onJsConfirm(WebView view, String url, String message,
JsResult result)
|
通知应用程序提供confirm 对话框。参数说明同上onJsAlert
1
2
|
public
boolean
onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result)
|
通知应用程序显示一个prompt对话框。 Tips必须调用result.confirm 方法如果应用程序接管这个方法。
1
2
|
public
boolean
onJsBeforeUnload(WebView view, String url, String message,
JsResult result)
|
1
2
3
|
public
void
onExceededDatabaseQuota(String url, String databaseIdentifier,
long
quota,
long
estimatedDatabaseSize,
long
totalQuota,
WebStorage.QuotaUpdater quotaUpdater)
|
通知应用程序webview内核web sql 数据库超出配额,请求是否扩大数据库磁盘配额。默认行为是不会增加数据库配额。参数说明:
@param url 触发这个数据库配额的url地址@param databaseIdentifier 指示出现数据库超过配额的标识。@param quota 原始数据库配额的大小,是字节单位bytes@param estimatedDatabaseSize 到达底线的数据大小 bytes@param totalQuota 总的数据库配额大小 bytes@param quotaUpdater 更新数据库配额的对象,可以使用 quotaUpdater.updateQuota(newQuota);配置新的数据库配额大小。
1
2
|
public
void
onReachedMaxAppCacheSize(
long
requiredStorage,
long
quota,
WebStorage.QuotaUpdater quotaUpdater)
|
通知应用程序内核已经到达最大的appcache。appcache是HTML5针对offline的一个数据处理标准。
1
2
|
public
void
onGeolocationPermissionsShowPrompt(String origin,
GeolocationPermissions.Callback callback)
|
当前页面请求是否允许进行定位。
GeolocationPermissions.Callback的使用
public void invoke(String origin, boolean allow, boolean retain);
参数说明:@param origin 权限设置的源地址@param allow 是否允许定位@retain 当前的选择是否让内核记住。
1
|
public
void
onGeolocationPermissionsHidePrompt()
|
1
|
public
void
openFileChooser(ValueCallback<uri> uploadFile, String acceptType, String capture)</uri>
|
有问题欢迎讨论。