Android WebView 开发详解(二)
转载请注明出处 http://blog.csdn.net/typename/article/details/39495409 powered by meichal zhao
概览:
Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页加载过程中做应用程序想处理的事情。比如说客户端需要显示网页加载的进度、网页加载发生错误等等事件。 WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者可以继承这两个类,接手相应事件处理。WebViewClient 主要提供网页加载各个阶段的通知,比如网页开始加载onPageStarted,网页结束加载onPageFinished等;WebChromeClient主要提供网页加载过程中提供的数据内容,比如返回网页的title,favicon等。
1.WebViewClient的基本使用
class MyAndroidWebViewClient extends WebViewClient { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // TODO } @Override public void onPageFinished(WebView view, String url) { // TODO }
} webview.setWebViewClient(new MyAndroidWebViewClient ());
2.WebViewClient API详解
public boolean shouldOverrideUrlLoading(WebView view, String url)当加载的网页需要重定向的时候就会回调这个函数告知我们应用程序是否需要接管控制网页加载,如果应用程序接管,并且return true意味着主程序接管网页加载,如果返回false让webview自己处理。
public void onPageStarted(WebView view, String url, Bitmap favicon)当内核开始加载访问的url时,会通知应用程序,对每个main frame这个函数只会被调用一次,页面包含iframe 或者framesets 不会另外调用一次onPageStarted,当网页内内嵌的frame 发生改变时也不会调用onPageStarted。
public void onPageFinished(WebView view, String url)
当内核加载完当前页面时会通知我们的应用程序,这个函数只有在main frame情况下才会被调用,当调用这个函数之后,渲染的图片不会被更新,如果需要获得新图片的通知可以使用@link WebView.PictureListener#onNewPicture。
public void onLoadResource(WebView view, String url)通知应用程序WebView即将加载url 制定的资源
public WebResourceResponse shouldInterceptRequest(WebView view, String url)通知应用程序内核即将加载url制定的资源,应用程序可以返回本地的资源提供给内核,若本地处理返回数据,内核不从网络上获取数据。
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)当浏览器访问制定的网址发生错误时会通知我们应用程序,比如网络错误。
public void onFormResubmission(WebView view, Message dontResend, Message resend)如果浏览器需要重新发送POST请求,可以通过这个时机来处理。默认是不重新发送数据。
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload)
通知应用程序可以将当前的url存储在数据库中,意味着当前的访问url已经生效并被记录在内核当中。这个函数在网页加载过程中只会被调用一次。注意网页前进后退并不会回调这个函数。
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)
当网页加载资源过程中发现SSL错误会调用此方法。我们应用程序必须做出响应,是取消请求handler.cancel(),还是继续请求handler.proceed();内核的默认行为是handler.cancel();
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
通知应用程序WebView接收到了一个Http auth的请求,应用程序可以使用supplied 设置webview的响应请求。默认行为是cancel 本次请求。
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event)提供应用程序同步一个处理按键事件的机会,菜单快捷键需要被过滤掉。如果返回true,webview不处理该事件,如果返回false, webview会一直处理这个事件,因此在view 链上没有一个父类可以响应到这个事件。默认行为是return false;
public void onScaleChanged(WebView view, float oldScale, float newScale)通知应用程序webview 要被scale。应用程序可以处理改事件,比如调整适配屏幕。
public void onReceivedLoginRequest(WebView view, String realm, String account, String args)
通知应用程序有个自动登录的帐号过程
4. WebChromeClient API详解
public void onProgressChanged(WebView view, int newProgress)通知应用程序当前网页加载的进度。
public void onReceivedTitle(WebView view, String title)
当document 的title变化时,会通知应用程序
public void onReceivedIcon(WebView view, Bitmap icon)
当前页面有个新的favicon时候,会回调这个函数。
public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed)
public void onShowCustomView(View view, CustomViewCallback callback)
通知应用程序webview需要显示一个custom view,主要是用在视频全屏HTML5Video support。
public void onHideCustomView()退出视频通知
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)请求创建一个新的窗口,如果我们应用程序接管这个请求,必须返回true,并且创建一个新的webview来承载主窗口。
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(); }
public void onRequestFocus(WebView view)webview请求得到focus,发生这个主要是当前webview不是前台状态,是后台webview。
public void onCloseWindow(WebView window)
通知应用程序从关闭传递过来的webview并从view tree中remove。
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
通知应用程序显示javascript alert对话框,如果应用程序返回true内核认为应用程序处理这个消息,返回false,内核自己处理。
@param url 当前请求弹出javascript 对话框webview 加载的url地址。
public boolean onJsConfirm(WebView view, String url, String message, JsResult result)
通知应用程序提供confirm 对话框。
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)
通知应用程序显示一个prompt对话框。
public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result)通知应用程序显示一个对话框,让用户选择是否离开当前页面,这个回调是javascript中的onbeforeunload事件,如果客户端返回true,内核会认为客户端提供对话框。默认行为是return false。
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, WebStorage.QuotaUpdater quotaUpdater)
通知应用程序webview内核web sql 数据库超出配额,请求是否扩大数据库磁盘配额。默认行为是不会增加数据库配额。
public void onReachedMaxAppCacheSize(long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater)
通知应用程序内核已经到达最大的appcache。
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback)
当前页面请求是否允许进行定位。
public void onGeolocationPermissionsHidePrompt()
public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)这个回调是私有回调, 当页面需要请求打开系统的文件选择器,则会回调这个方法,比如我们需要上传图片,请求拍照,邮件的附件上传等等操作。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。