转载请注明出处   powered by miechal zhao



概览:

   Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页加载过程中做应用程序想处理的事情。比如说客户端需要显示网页加载的进度、网页加载发生错误等等事件。 WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者可以继承这两个类,接手相应事件处理。WebViewClient 主要提供网页加载各个阶段的通知,比如网页开始加载onPageStarted,网页结束加载onPageFinished等;WebChromeClient主要提供网页加载过程中提供的数据内容,比如返回网页的title,favicon等。

1.WebViewClient的基本使用


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


[java]  view plain copy


1. class MyAndroidWebViewClient extends WebViewClient {  
2. @Override  
3. public void onPageStarted(WebView view, String url, Bitmap favicon) {  
4. // TODO  
5.     }  
6.   
7. @Override  
8. public void onPageFinished(WebView view, String url) {  
9. // TODO  
10.     }


[java]  view plain copy



    1. }  
    2. webview.setWebViewClient(new MyAndroidWebViewClient ());



    2.WebViewClient API详解


    1)网页加载时机部分


    [java]  view plain copy



    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。



    [java]  view plain copy



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



    [java]  view plain copy



    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




    [java]  view plain copy



    1. public void onLoadResource(WebView view, String url)  



    参数说明:



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



    @param url    即将加载的url 资源




    [java]  view plain copy


    1. public WebResourceResponse shouldInterceptRequest(WebView view,  
    2.             String url)

    参数说明:



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



    @param url    raw url 制定的资源



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




    Tips


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


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



    [java]  view plain copy


    1. public void onReceivedError(WebView view, int errorCode,  
    2.             String description, String failingUrl)

    参数说明:



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



    @param description 描述错误的信息



    @param failingUrl  当前访问失败的url,注意并不一定是我们主url





    Tips



    在onReceiveError我们可以自定义网页的错误页面。





    [java]  view plain copy


    1. public void onFormResubmission(WebView view, Message dontResend,  
    2.             Message resend)

    参数说明:



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



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





    [java]  view plain copy


    1. public void doUpdateVisitedHistory(WebView view, String url,  
    2. boolean isReload)


    通知应用程序可以将当前的url存储在数据库中,意味着当前的访问url已经生效并被记录在内核当中。这个函数在网页加载过程中只会被调用一次。注意网页前进后退并不会回调这个函数。


    参数说明:



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



    @ param isReload 如果是true 这个是正在被reload的url







    [java]  view plain copy



    1. public void onReceivedSslError(WebView view, SslErrorHandler handler,  
    2.             SslError error)  



    当网页加载资源过程中发现SSL错误会调用此方法。我们应用程序必须做出响应,是取消请求handler.cancel(),还是继续请求handler.proceed();内核的默认行为是handler.cancel();





    参数说明:



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



    @param error  SSL错误对象





    Tips



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





    [java]  view plain copy



    1. public void onReceivedHttpAuthRequest(WebView view,  
    2.             HttpAuthHandler handler, String host, String realm)  



    通知应用程序WebView接收到了一个Http auth的请求,应用程序可以使用supplied 设置webview的响应请求。默认行为是cancel 本次请求。



    参数说明:



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



    @param host  请求认证的host



    @param realm 认真请求所在的域





    [java]  view plain copy



    1. public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event)   



    参数说明:



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



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





    [java]  view plain copy



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

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



    [java]  view plain copy



    1. public void onReceivedLoginRequest(WebView view, String realm,  
    2.             String account, String args)  



    通知应用程序有个自动登录的帐号过程



    参数说明:



    @param view 请求登陆的webview



    @param realm 账户的域名,用来查找账户。



    @param account 一个可选的账户,如果是null 需要和本地的账户进行check, 如果是一个可用的账户,则提供登录。



    @param  args  验证制定参数的登录用户





    3.WebChromeClient 基本使用





    4. WebChromeClient API详解



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





    [java]  view plain copy



    1. public void onProgressChanged(WebView view, int newProgress)  


    参数说明:



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


    [java]  view plain copy



    1. public void onReceivedTitle(WebView view, String title)  



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


    参数说明:



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


    Tips


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



    [java]  view plain copy



    1. public void onReceivedIcon(WebView view, Bitmap icon)  



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



    参数说明:



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



    [java]  view plain copy



      1. public void onReceivedTouchIconUrl(WebView view, String url,  
      2. boolean precomposed)




      通知应用程序 apple-touch-icon的 url 

      参数说明:



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


      @param precomposed  如果precomposed 是true 则touch-icon是预先创建的


      Tips 


      如果应用程序需要这个icon的话, 可以通过这个url获取得到 icon。



      [java]  view plain copy



      1. public void onShowCustomView(View view, CustomViewCallback callback)  



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


      参数说明:


      @param view 即将要显示的view


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




      [java]  view plain copy



      1. public void onHideCustomView()  



      [java]  view plain copy



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


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


        参数说明:


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


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


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


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


        Tips 具体例子如下:


        [java]  view plain copy


        1.   private void createWindow(final Message msg) {  
        2. WebView.WebViewTransport transport = (WebView.WebViewTransport) msg.obj;  
        3. final Tab newTab = mWebViewController.openTab(null, Tab.this, true,  
        4. true);  
        5. transport.setWebView(newTab.getWebView());  
        6. msg.sendToTarget();  
        7.   }


        [java]  view plain copy



        1. public void onRequestFocus(WebView view)  



        [java]  view plain copy



        1. public void onCloseWindow(WebView window)  



        通知应用程序从关闭传递过来的webview并从view tree中remove。



        [java]  view plain copy


        1. public boolean onJsAlert(WebView view, String url, String message,  
        2.             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住。



        [java]  view plain copy



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



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


        参数说明同上onJsAlert



        [java]  view plain copy



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



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


        Tips


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



        [java]  view plain copy


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

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



        [java]  view plain copy

        1. public void onExceededDatabaseQuota(String url, String databaseIdentifier,  
        2. long quota, long estimatedDatabaseSize, long totalQuota,  
        3.             WebStorage.QuotaUpdater quotaUpdater)

        通知应用程序webview内核web sql 数据库超出配额,请求是否扩大数据库磁盘配额。默认行为是不会增加数据库配额。


        参数说明:



        @param url 触发这个数据库配额的url地址


        指示出现数据库超过配额的标识。


        @param quota   原始数据库配额的大小,是字节单位bytes


        @param estimatedDatabaseSize  到达底线的数据大小 bytes


        @param totalQuota 总的数据库配额大小 bytes


        @param quotaUpdater 更新数据库配额的对象,可以使用 quotaUpdater.updateQuota(newQuota);配置新的数据库配额大小。



        [java]  view plain copy


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

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


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



        [java]  view plain copy


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

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


        GeolocationPermissions.Callback的使用 
         
         
         
         
         
        
          public void invoke(String origin, boolean allow, boolean retain);

        参数说明:


        @param origin 权限设置的源地址


        @param allow 是否允许定位


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



        [java]  view plain copy



        1. public void onGeolocationPermissionsHidePrompt()  



        [java]  view plain copy



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


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