Skip to content

02.该库如何使用

杨充 edited this page Jul 6, 2020 · 3 revisions

02.该库如何使用

目录介绍

  • 2.1 如何引入该库
  • 2.2 最简单使用
  • 2.3 常用api说明
  • 2.4 使用建议
  • 2.5 关于web页面异常状态区分类型
  • 2.6 如何使用拦截缓存
  • 2.7 使用Https+Dns
  • 2.8 关于添加混淆

2.1 如何引入

  • 如何引用,该x5的库已经更新到最新版本,引用最新1.4.0稳定版
    //普通版本
    implementation 'cn.yc:WebViewLib:1.2.4'
    
    //添加阿里https+dns解析版本
    implementation 'cn.yc:WebViewLib:1.4.0'
    

2.2 最简单使用

  • 项目初始化
    X5WebUtils.init(this);
    
  • 可以使用X5WebView,已经做了常见的setting属性设置
    <X5WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbarSize="3dp" />
    
  • 如果想有带进度的,可以使用ProgressWebView
    <可以使用ProgressWebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbarSize="3dp" />
    
  • 如何使用自己的WebViewClient和WebChromeClient
    //主要是在X5WebViewClient和X5WebChromeClient已经做了很多常见的逻辑处理,如果不满足你使用,可以如下这样写
    YcX5WebViewClient webViewClient = new YcX5WebViewClient(webView, this);
    webView.setWebViewClient(webViewClient);
    YcX5WebChromeClient webChromeClient = new YcX5WebChromeClient(webView,this);
    webView.setWebChromeClient(webChromeClient);
    
    private class YcX5WebViewClient extends MyX5WebViewClient {
        public YcX5WebViewClient(X5WebView webView, Context context) {
            super(webView, context);
        }
    
        //重写你需要的方法即可
    }
    
    private class YcX5WebChromeClient extends X5WebChromeClient{
        public YcX5WebChromeClient(X5WebView webView,Activity activity) {
            super(webView,activity);
            //重写你需要的方法即可
        }
    }
    
  • 针对类似购物的商品详情页面的webView
    • 当WebView在最顶部或者最底部的时候,不消费事件,则可以使用VerticalWebView

2.3 常用api

  • 关于web的接口回调,包括常见状态页面切换,进度条变化等监听处理
    mWebView.getX5WebChromeClient().setWebListener(interWebListener);
    private InterWebListener interWebListener = new InterWebListener() {
        @Override
        public void hindProgressBar() {
            pb.setVisibility(View.GONE);
        }
    
        @Override
        public void showErrorView(@X5WebUtils.ErrorType int type) {
            //设置自定义异常错误页面
        }
    
        @Override
        public void startProgress(int newProgress) {
            //该方法是是监听进度条进度变化的逻辑
            pb.setProgress(newProgress);
        }
    
        @Override
        public void showTitle(String title) {
            //该方法是监听h5中title
        }
    };
    
  • 关于视频播放的时候,web的接口回调,主要是视频相关回调,比如全频,取消全频,隐藏和现实webView
    x5WebChromeClient = x5WebView.getX5WebChromeClient();
    x5WebChromeClient.setVideoWebListener(new VideoWebListener() {
        @Override
        public void showVideoFullView() {
            //视频全频播放时监听
        }
    
        @Override
        public void hindVideoFullView() {
            //隐藏全频播放,也就是正常播放视频
        }
    
        @Override
        public void showWebView() {
            //显示webView
        }
    
        @Override
        public void hindWebView() {
            //隐藏webView
        }
    });
    
  • 其他api说明
    //X5WebView中
    //设置是否开启密码保存功能,不建议开启,默认已经做了处理,存在盗取密码的危险
    mWebView.setSavePassword(false);
    //是否开启软硬件加速
    mWebView.setOpenLayerType(false);
    //获取x5WebChromeClient对象
    x5WebChromeClient = mWebView.getX5WebChromeClient();
    //获取x5WebViewClient对象
    x5WebViewClient = mWebView.getX5WebViewClient();
    
  • 关于如何使用仿微信加载H5页面进度条
    • 前端页面时受到网路环境,页面内容大小的影响有时候会让用户等待很久。显示一个加载进度条可以说很大程度上提升用户的体验。
    private WebProgress pb;
    //显示进度条
    pb.show();
    //设置进度条过度颜色
    pb.setColor(Color.BLUE,Color.RED);
    //设置单色进度条
    pb.setColor(Color.BLUE);
    //为单独处理WebView进度条
    pb.setWebProgress(newProgress);
    //进度完成后消失
    pb.hide();
    
  • 设置cookie和清除cookie操作
    //同步cookie
    WebkitCookieUtils.syncCookie(this,url,cookieList);
    //清除cookie
    WebkitCookieUtils.remove(url);
    

2.4 使用建议

  • 优化一下相关的操作
    • 关于设置js支持的属性
    @Override
    public void onResume() {
        super.onResume();
        if (mWebView != null) {
            mWebView.getSettings().setJavaScriptEnabled(true);
        }
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        if (mWebView != null) {
            mWebView.getSettings().setJavaScriptEnabled(false);
        }
    }
    
    • 关于destroy销毁逻辑
    @Override
    protected void onDestroy() {
        if (webView != null) {
            webView.destroy();
        }
        super.onDestroy();
    }
    

2.5 关于web页面异常状态区分类型

  • 对于web加载异常,分为多种状态,比如常见的有,没有网络;404加载异常;onReceivedError,请求网络出现error;在加载资源时通知主机应用程序发生SSL错误
    @Override
    public void showErrorView(@X5WebUtils.ErrorType int type) {
        switch (type){
            //没有网络
            case X5WebUtils.ErrorMode.NO_NET:
                break;
            //404,网页无法打开
            case X5WebUtils.ErrorMode.STATE_404:
                break;
            //onReceivedError,请求网络出现error
            case X5WebUtils.ErrorMode.RECEIVED_ERROR:
                break;
            //在加载资源时通知主机应用程序发生SSL错误
            case X5WebUtils.ErrorMode.SSL_ERROR:
                break;
            default:
                break;
        }
    }
    

2.6 如何使用拦截缓存

  • 针对x5库的webView拦截使用方法如下所示,要是你想单独用这块缓存的功能,你可以直接将cache代码拷贝到你的项目中。功能独立,拿来即用!
    YcX5WebViewClient webViewClient = new YcX5WebViewClient(mWebView, this);
    mWebView.setWebViewClient(webViewClient);
    
    private class YcX5WebViewClient extends JsX5WebViewClient {
        public YcX5WebViewClient(X5WebView webView, Context context) {
            super(webView, context);
        }
    
        /**
         * 此方法废弃于API21,调用于非UI线程,拦截资源请求并返回响应数据,返回null时WebView将继续加载资源
         * 注意:API21以下的AJAX请求会走onLoadResource,无法通过此方法拦截
         *
         * 其中 WebResourceRequest 封装了请求,WebResourceResponse 封装了响应
         * 封装了一个Web资源的响应信息,包含:响应数据流,编码,MIME类型,API21后添加了响应头,状态码与状态描述
         * @param webView                           view
         * @param s                                 s
         */
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView webView, String s) {
            WebResourceResponse request = WebViewCacheDelegate.getInstance().interceptRequest(s);
            return WebResponseAdapter.adapter(request);
        }
    
        /**
         * 此方法添加于API21,调用于非UI线程,拦截资源请求并返回数据,返回null时WebView将继续加载资源
         *
         * 其中 WebResourceRequest 封装了请求,WebResourceResponse 封装了响应
         * 封装了一个Web资源的响应信息,包含:响应数据流,编码,MIME类型,API21后添加了响应头,状态码与状态描述
         * @param webView                           view
         * @param webResourceRequest                request,添加于API21,封装了一个Web资源的请求信息,
         *                                          包含:请求地址,请求方法,请求头,是否主框架,是否用户点击,是否重定向
         * @return
         */
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest) {
            WebResourceResponse request = WebViewCacheDelegate.getInstance().
                    interceptRequest(webResourceRequest);
            return WebResponseAdapter.adapter(request);
        }
    
    }
    

2.7 使用Https+Dns

2.8 添加混淆

  • 代码如下所示
    # 该包下所有的类和类成员不混淆
    -keep class com.ycbjie.webviewlib.** {
        *;
    }
    -dontwarn com.ycbjie.webviewlib.**