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的基本使用

创建WebViewClient实例并设置到WebView对象中,具体代码参考如下:

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详解

1)网页加载时机部分

public boolean shouldOverrideUrlLoading(WebView view, String url)

当加载的网页需要重定向的时候就会回调这个函数告知我们应用程序是否需要接管控制网页加载,如果应用程序接管,并且return true意味着主程序接管网页加载,如果返回false让webview自己处理。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param url    即将要被加载的url

@return  true 当前应用程序要自己处理这个url, 返回false则不处理。

Tips

(1) 当请求的方式是"POST"方式时这个回调是不会通知的。

(2) 当我们访问的地址需要我们应用程序自己处理的时候,可以在这里截获,比如我们发现跳转到的是一个market的链接,那么我们可以直接跳转到应用市场,或者其他app。

public void onPageStarted(WebView view, String url, Bitmap favicon)

当内核开始加载访问的url时,会通知应用程序,对每个main frame这个函数只会被调用一次,页面包含iframe 或者framesets 不会另外调用一次onPageStarted,当网页内内嵌的frame 发生改变时也不会调用onPageStarted。

参数说明:

@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不一定每次都被调用,只有需要的时候才会被调用。

public void onPageFinished(WebView view, String url)

当内核加载完当前页面时会通知我们的应用程序,这个函数只有在main frame情况下才会被调用,当调用这个函数之后,渲染的图片不会被更新,如果需要获得新图片的通知可以使用@link WebView.PictureListener#onNewPicture。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param url    即将要被加载的url

public void onLoadResource(WebView view, String url)

通知应用程序WebView即将加载url 制定的资源

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param url    即将加载的url 资源

public WebResourceResponse shouldInterceptRequest(WebView view,
            String url)

通知应用程序内核即将加载url制定的资源,应用程序可以返回本地的资源提供给内核,若本地处理返回数据,内核不从网络上获取数据。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param url    raw url 制定的资源

@return 返回WebResourceResponse包含数据对象,或者返回null

Tips

这个回调并不一定在UI线程执行,所以我们需要注意在这里操作View或者私有数据相关的动作。

如果我们需要改变网页的背景,或者需要实现网页页面颜色定制化的需求,可以在这个回调时机处理。

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我们可以自定义网页的错误页面。

public void onFormResubmission(WebView view, Message dontResend,
            Message resend)

如果浏览器需要重新发送POST请求,可以通过这个时机来处理。默认是不重新发送数据。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param dontResent 当浏览器不需要重新发送数据时,可以使用这个参数。

@param resent 当浏览器需要重新发送数据时, 可以使用这个参数。

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

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

内核会记住本次选择,如果下次还有相同的错误,内核会直接执行之前选择的结果。

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 认真请求所在的域

public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) 

提供应用程序同步一个处理按键事件的机会,菜单快捷键需要被过滤掉。如果返回true,webview不处理该事件,如果返回false, webview会一直处理这个事件,因此在view 链上没有一个父类可以响应到这个事件。默认行为是return false;

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param  event 键盘事件名

@return  如果返回true,应用程序处理该时间,返回false 交有webview处理。

public void onScaleChanged(WebView view, float oldScale, float newScale)

通知应用程序webview 要被scale。应用程序可以处理改事件,比如调整适配屏幕。

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对象中,具体代码参考如下:

public void onProgressChanged(WebView view, int newProgress)

通知应用程序当前网页加载的进度。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

public void onReceivedTitle(WebView view, String title)

当document 的title变化时,会通知应用程序

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param title  document新的title

Tips

这个函数调用时机不确定,有可能很早,有可能很晚,取决于网页把title设置在什么位置,大多数网页一般把title设置到页面的前面,因此很多情况会比较早回调到这个函数。

public void onReceivedIcon(WebView view, Bitmap icon)

当前页面有个新的favicon时候,会回调这个函数。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param icon 当前页面的favicon

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。

public void onShowCustomView(View view, CustomViewCallback callback)

通知应用程序webview需要显示一个custom view,主要是用在视频全屏HTML5Video support。

参数说明:

@param view 即将要显示的view

@param callback  当view 需要dismiss 则使用这个对象进行回调通知。

public void onHideCustomView()

退出视频通知

public boolean onCreateWindow(WebView view, boolean isDialog,
            boolean isUserGesture, Message resultMsg)

请求创建一个新的窗口,如果我们应用程序接管这个请求,必须返回true,并且创建一个新的webview来承载主窗口。

如果应用程序不处理,则需要返回false,默认行为和返回false表现一样。

参数说明:

@param view 请求创建新窗口的webview

@param isUserGesture 如果是true,则说明是来自用户收拾操作行为,比如用户点击链接

@param isDialog true 请求创建的新窗口必须是个dialog,而不是全屏的窗口。

@param resultMsg 当webview创建时需要发送一个消息。WebView.WebViewTransport.setWebView(WebView)

Tips 具体例子如下:

    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 view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 当前请求弹出javascript 对话框webview 加载的url地址。

@param message 弹出的内容信息

@result 用来响应用户的处理。


Tips

如果我们应用接管处理, 则必须给出result的结果,result.cancel,result.comfirm必须调用其中之后,否则内核会hang住。

public boolean onJsConfirm(WebView view, String url, String message,
            JsResult result)

通知应用程序提供confirm 对话框。

参数说明同上onJsAlert

public boolean onJsPrompt(WebView view, String url, String message,
            String defaultValue, JsPromptResult result)

通知应用程序显示一个prompt对话框。

Tips

必须调用result.confirm 方法如果应用程序接管这个方法。

public boolean onJsBeforeUnload(WebView view, String url, String message,
            JsResult result)

通知应用程序显示一个对话框,让用户选择是否离开当前页面,这个回调是javascript中的onbeforeunload事件,如果客户端返回true,内核会认为客户端提供对话框。默认行为是return false。

参数说明和之前介绍的onJsAlert()相同。

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);配置新的数据库配额大小。

public void onReachedMaxAppCacheSize(long requiredStorage, long quota,
            WebStorage.QuotaUpdater quotaUpdater)

通知应用程序内核已经到达最大的appcache。

appcache是HTML5针对offline的一个数据处理标准。

public void onGeolocationPermissionsShowPrompt(String origin,
            GeolocationPermissions.Callback callback)

当前页面请求是否允许进行定位。

GeolocationPermissions.Callback的使用

public void invoke(String origin, boolean allow, boolean retain);

参数说明:

@param origin 权限设置的源地址

@param allow 是否允许定位

@retain 当前的选择是否让内核记住。

public void onGeolocationPermissionsHidePrompt()

public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)

这个回调是私有回调, 当页面需要请求打开系统的文件选择器,则会回调这个方法,比如我们需要上传图片,请求拍照,邮件的附件上传等等操作。

如果不实现这个私有API,则上面的请求都将不会执行。

有问题欢迎讨论。

时间: 2024-10-29 19:10:14

Android WebView 开发详解(二)的相关文章

Android WebView 开发详解

Android WebView 开发详解 1.概览: Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页加载过程中做应用程序想处理的事情.比如说客户端需要显示网页加载的进度.网页加载发生错误等等事件. WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者可以继承这两个类,接手相应事件处理.WebViewClient 主要提供网页加载各个阶段的通知,比如网页开

Android WebView 开发详解(一)

转载请注明出处  http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao 概览: Android WebView在Android平台上是一个特殊的View, 他能用来显示网页,这个类可以被用来在你的app中仅仅显示一张在线的网页,还可以用来开发浏览器.WebView内部实现是采用渲染引擎来展示view的内容,提供网页前进后退,网页放大,缩小,搜索,前端开发者可以使用web inspector(A

Android Widget 开发详解(二)

转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是android的七大组件之一,对widget陌生的朋友可以阅读下我的上篇文章< Android Widget工作原理详解(一)> 今天我们就实现一个可以滑动的widet,熟悉下一个普通widget的开发. 一 创建AppWidgetProvider 此类是widget的控制核心,主要控制添加,删除,更新等.他

Android WebView 开发详解(三)

转载请注明出处   http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android WebView提供展示网页,也提供我们应用程序对网页加载的一些定制,比如我们为了减少网络数据可以设置当前加载的页面不能显示图片,如果是pc网址在pad上访问我们可以提供用户一种概览模式的浏览方式,可以提供放大网页字体等定制功能.Android 提供管理WebView的一些setting的类WebSe

Android相机开发详解(一)

Android相机开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的csdn博客) Android相机开发能够实现打开相机,前后摄像头切换,摄像预览,保存图片,浏览已拍照图片等相机功能. Android相机开发详解(一)主要实现打开相机,摄像预览,前后置摄像头切换,保存图片等四个功能. Android相机开发详解(二)主要实现翻页浏览相片,触控缩放浏览图片,删除图片,发送图片等四个功能. Andro

【转】【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo.实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相交流.学习和参考,博主只求能和大家共同进步.希望能多多支持! 这篇文章中,我们使用到了Share SDK,它是为iOS.Android.WP8的APP提供社会化功能的一

Android开发经典书籍下载——《Android 4高级编程》《疯狂Android讲义》《Android应用开发详解(郭宏志)》《Android应用案例开发大全》《Android 3D游戏开发技术》

这是我收集的关于android开发方面的经典书籍,高清PDF电子版,可以在我的百度网盘免费下载,希望对需要的朋友有帮助. 目录: <Android 4高级编程>(附完整源代码) <疯狂Android讲义> <Android应用开发详解(郭宏志)> <Android应用案例开发大全> <Android 3D游戏开发技术> <Android内核剖析 柯元旦> <深入理解Android  卷1> <深入理解Android

Android WebView使用详解包括js互调

目前很多android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优点: 可以直接显示和渲染web页面,直接显示网页 webview可以直接用html文件(网络上或本地assets中)作布局 和JavaScript交互调用 一.基本使用 首先layout中即为一个基本的简单控件: <WebView android:id="@+id/webView1"

Android WebView 开发具体解释(二)

转载请注明出处  http://blog.csdn.net/typename/article/details/39495409 powered by miechal zhao 概览: Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页载入过程中做应用程序想处理的事情.比方说client须要显示网页载入的进度.网页载入错误发生等等事件. WebView提供两个事件回调类给应用层,分别为WebViewClient,Web