目录介绍

  • 01.前沿说明

    • 1.1 案例展示效果
    • 1.2 该库功能和优势
    • 1.3 相关类介绍说明
    • 1.4 WebView知识点
  • 02.如何使用
    • 2.1 如何引入
    • 2.2 最简单使用
    • 2.3 常用api
    • 2.4 使用建议
    • 2.5 异常状态类型区分
    • 2.6 该库流程图
  • 03.js调用
    • 3.1 Java调用js方法
    • 3.2 js调用java方法
    • 3.3 js的调用时机分析
    • 3.4 js交互原理分析
  • 04.问题反馈
  • 05.webView优化
  • 06.关于参考
  • 07.其他说明介绍

01.前沿说明

  • 基于腾讯x5开源库,提高webView开发效率,大概要节约你百分之六十的时间成本。该案例支持处理js的交互逻辑且无耦合、同时暴露进度条加载进度、可以监听异常error状态、支持视频播放并且可以全频、支持加载word,xls,ppt,pdf,txt等文件文档、发短信、打电话、发邮件、打开文件操作上传图片、唤起原生App、x5库为最新版本,功能强大。项目地址:webView开源库
  • 同时,该案例中,04问题反馈也记录了绝大多数实际开发中遇到的问题,如果还有其他的问题,也可以发送给我,我收集起来放到一起,方便后期查阅。
  • 可以说,该开源库,以及附带的webView基础知识点,问题汇总,以及优化方案等笔记,相对来说比较系统而又全面的梳理webView的知识体系,相对而言也是比较实用的,也不乏参考了一些好的案例和博客文章。

1.1 案例展示效果

  • WebView启动过程大概分为以下几个阶段,这里借鉴美团的一张图片

1.2 该库功能和优势

  • 提高webView开发效率,大概要节约你百分之六十的时间成本,一键初始化操作;
  • 支持处理js的交互逻辑,方便快捷,并且无耦合,操作十分简单;
  • 暴露进度条加载进度,结束,以及异常状态(分多种状态:无网络,404,onReceivedError,sslError异常等)listener给开发者;
  • 支持视频播放,可以切换成全频播放视频,可旋转屏幕,暴露视频操作监听listener给开发者;
  • 集成了腾讯x5的WebView,最新版本,功能强大;
  • 支持打开文件的操作,比如打开相册,然后选中图片上传,兼容版本(5.0);
  • 支持加载word,xls,ppt,pdf,txt等文件文档,使用方法十分简单;
  • 支持设置仿微信加载H5页面进度条,完全无耦合,操作简单,极大提高用户体验;
  • 支持用户按照规范自定义WebViewClient和WebChromeClient,不影响js通信;
  • 汇集绝大多数问题,以及解决方案,是学习和深入理解webView的一个比较全面的案例;

1.3 相关类介绍说明

  • BridgeHandler 接口,主要处理消息回调逻辑
  • BridgeUtil 工具类,静态常量,以及获取js消息的一些方法,final修饰
  • BridgeWebView 自定义WebView类,主要处理与js之间的消息
  • CallBackFunction js回调
  • DefaultHandler 默认的BridgeHandler
  • InterWebListener 接口,web的接口回调,包括常见状态页面切换【状态页面切换】,进度条变化【显示和进度监听】等
  • Message 自定义消息Message实体类
  • ProgressWebView 自定义带进度条的webView
  • WebViewJavascriptBridge js桥接接口
  • X5WebChromeClient 自定义x5的WebChromeClient,处理进度监听,title变化,以及上传图片,后期添加视频处理逻辑
  • X5WebUtils 工具类,初始化腾讯x5浏览器webView,及调用该类init方法
  • X5WebView 可以使用这个类,方便统一初始化WebSettings的一些属性,如果不用这里的,想单独初始化setting属性,也可以直接使用BridgeWebView
  • X5WebViewClient 自定义x5的WebViewClient,如果要自定义WebViewClient必须要集成此类,一定要继承该类,因为注入js监听是在该类中操作的
  • WebProgress 仿微信加载H5页面的WebView进度条

1.4 WebView基础知识点

02.如何使用

2.1 如何引入

  • 如何引用,该x5的库已经更新到最新版本,引用最新1.2.0稳定版

    implementation 'cn.yc:WebViewLib:1.2.0'
    

2.2 最简单使用

  • 项目初始化

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

2.3 常用api

  • 关于web的接口回调,包括常见状态页面切换,进度条变化等监听处理

    mWebView.getX5WebChromeClient().setWebListener(interWebListener);
    private InterWebListener interWebListener = new InterWebListener() {@Overridepublic void hindProgressBar() {pb.setVisibility(View.GONE);}@Overridepublic void showErrorView(@X5WebUtils.ErrorType int type) {//设置自定义异常错误页面}@Overridepublic void startProgress(int newProgress) {//该方法是是监听进度条进度变化的逻辑pb.setProgress(newProgress);}@Overridepublic void showTitle(String title) {//该方法是监听h5中title}
    };
    
  • 关于视频播放的时候,web的接口回调,主要是视频相关回调,比如全频,取消全频,隐藏和现实webView
    x5WebChromeClient = x5WebView.getX5WebChromeClient();
    x5WebChromeClient.setVideoWebListener(new VideoWebListener() {@Overridepublic void showVideoFullView() {//视频全频播放时监听}@Overridepublic void hindVideoFullView() {//隐藏全频播放,也就是正常播放视频}@Overridepublic void showWebView() {//显示webView}@Overridepublic 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
    X5WebUtils.syncCookie(this,"url",cookieList);
    //清除cookie
    X5WebUtils.removeCookie(this);
    

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() {try {if (webView != null) {webView.stopLoading();webView.destroy();webView = null;}} catch (Exception e) {Log.e("X5WebViewActivity", e.getMessage());}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,请求网络出现errorcase X5WebUtils.ErrorMode.RECEIVED_ERROR:break;//在加载资源时通知主机应用程序发生SSL错误case X5WebUtils.ErrorMode.SSL_ERROR:break;default:break;}
    }
    

2.6 该库流程图

  • java调用js的流程图

    • 第一步操作:mWebView.callHandler(“functionInJs”, “小杨逗比”, new CallBackFunction() {//这里面是回调});
    • 第二步操作:将handlerName,data,responseCallback,封装到Message对象中,然后开始分发数据,最后webView执行_handleMessageFromNative;
    • 第三步操作:去WebViewJavascriptBridge.js类中找到_handleMessageFromNative方法,js根据"functionInJs"找到对应的js方法并且执行;
    • 第四步操作:js把运行结果保存到message对象中,然后添加到js消息队列中;
    • 第五步操作:在_dispatchMessageFromNative方法中,可以看到,js向native发送 “消息队列中有消息” 的通知;
    • 第六步操作:webView执行js的_fetchQueue(WebViewJavascriptBridge.js类)方法;
    • 第七步操作:js把消息队列中的所有消息都一起回传给webView;
    • 第八步操作:webView收到所有的消息,一个一个串行处理,注意其中包括 "functionInJs"方法运行的结果的消息;
  • js调用Android的流程图
    • 第一步操作:mWebView.registerHandler(“toPhone”, new BridgeHandler() { //回调});
    • 第二步操作:调用messageHandlers.put(handlerName, handler),将名称和BridgeHandler对象放到map集合中
    • 第三步操作:在shouldOverrideUrlLoading方法中拦截url,与网页约定好一个协议,匹配则执行相应操作,也就是利用WebViewClient接口回调方法拦截url
    • 第四步操作:如果是url.startsWith(BridgeUtil.YY_RETURN_DATA)则有数据返回;如果是BridgeUtil.YY_OVERRIDE_SCHEMA则刷新消息队列
    • 第五步操作:通过BridgeHandler对象,将data和callBackFunction返回交给开发者

03.js交互操作

3.1 Java调用js的使用方法

  • 代码如下所示,下面updateAttentionStatus代表js这边的方法名称

    • webView.callHandler(“updateAttentionStatus”, …, new CallBackFunction());这是Java层主动调用Js的”updateAttentionStatus”方法。
    mWebView.callHandler("updateAttentionStatus", attention, new CallBackFunction() {@Overridepublic void onCallBack(String data) {}
    });
    

3.2 js调用java的使用方法

  • 代码如下所示,下面中的toPhone代表的是Android这边提供给js的方法名称

    • webView.registerHandler(“toPhone”, …);这是Java层注册了一个叫”toPhone”的接口方法,目的是提供给Js来调用。这个”toPhone”的接口方法的回调就是BridgeHandler.handler()。
    mWebView.registerHandler("toPhone", new BridgeHandler() {@Overridepublic void handler(String data, CallBackFunction function) {try {JSONObject jsonData = new JSONObject(data);String phone = jsonData.optString("phone");//todo 打电话} catch (JSONException e) {e.printStackTrace();}}
    });
    
  • 如何回调数据给web那边
    //注意,这里回传数据目前只是支持String字符串类型
    function.onCallBack("回调数据");
    

3.3 js的调用时机分析

  • onPageFinished()或者onPageStarted()方法中注入js代码

    • 做过WebView开发,并且需要和js交互,大部分都会认为js在WebViewClient.onPageFinished()方法中注入最合适,此时dom树已经构建完成,页面已经完全展现出来。但如果做过页面加载速度的测试,会发现WebViewClient.onPageFinished()方法通常需要等待很久才会回调(首次加载通常超过3s),这是因为WebView需要加载完一个网页里主文档和所有的资源才会回调这个方法。
    • 能不能在WebViewClient.onPageStarted()中注入呢?答案是不确定。经过测试,有些机型可以,有些机型不行。在WebViewClient.onPageStarted()中注入还有一个致命的问题——这个方法可能会回调多次,会造成js代码的多次注入。
    • 从7.0开始,WebView加载js方式发生了一些小改变,官方建议把js注入的时机放在页面开始加载之后
  • WebViewClient.onProgressChanged()方法中注入js代码
    • WebViewClient.onProgressChanged()这个方法在dom树渲染的过程中会回调多次,每次都会告诉我们当前加载的进度。

      • 在这个方法中,可以给WebView自定义进度条,类似微信加载网页时的那种进度条
      • 如果在此方法中注入js代码,则需要避免重复注入,需要增强逻辑。可以定义一个boolean值变量控制注入时机
    • 那么有人会问,加载到多少才需要处理js注入逻辑呢?
      • 正是因为这个原因,页面的进度加载到80%的时候,实际上dom树已经渲染得差不多了,表明WebView已经解析了标签,这时候注入一定是成功的。在WebViewClient.onProgressChanged()实现js注入有几个需要注意的地方:
      • 1 上文提到的多次注入控制,使用了boolean值变量控制
      • 2 重新加载一个URL之前,需要重置boolean值变量,让重新加载后的页面再次注入js
      • 3 如果做过本地js,css等缓存,则先判断本地是否存在,若存在则加载本地,否则加载网络js
      • 4 注入的进度阈值可以自由定制,理论上10%-100%都是合理的,不过建议使用了75%到90%之间可以。

3.4 js交互原理分析

04.问题反馈

05.webView优化

06.关于参考

  • 感谢开源库

    • x5官方开发文档
    • JsBridge开源库
    • WebViewStudy开源库
    • DSBridge
  • 参考博客
    • WebView性能、体验分析与优化
    • WebView详解,常见漏洞详解和安全源码上
    • WebView详解,常见漏洞详解和安全源码下
    • 如何设计一个优雅健壮的Android WebView
    • 其他博客,这里只是记录一部分,感谢

07.其他说明介绍

关于博客汇总链接

  • 1.技术博客汇总
  • 2.开源项目汇总
  • 3.生活博客汇总
  • 4.喜马拉雅音频汇总
  • 5.其他汇总

其他推荐

  • 博客笔记大汇总【15年10月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计47篇[近100万字],转载请注明出处,谢谢!
  • 链接地址:https://github.com/yangchong211/YCBlogs
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!

WebView开源库终极方案相关推荐

  1. 基于腾讯 x5 开源库,提高 webView 开发效率,大概要节约你百分之六十的时间成本。该案例支持处理 js 的交互逻辑且无耦合、同时暴露进度条加载进度、可以监听异常 error 状态、支持视频播放

    YCWebView 项目地址:yangchong211/YCWebView 简介: 基于腾讯 x5 开源库,提高 webView 开发效率,大概要节约你百分之六十的时间成本.该案例支持处理 js 的交 ...

  2. 基于腾讯x5开源库,提高webView开发效率

    基于腾讯x5开源库,提高webView开发效率 文章目录 基于腾讯x5开源库,提高webView开发效率 01.前沿说明 1.1 案例展示效果 1.2 该库功能和优势 1.3 相关类介绍说明 02.如 ...

  3. iOS开发中解决第三方静态库符号冲突的终极方案

    iOS开发中解决第三方静态库符号冲突的终极方案 背景 在iOS开发的时候,经常会使用各种第三方静态库,这些库内部可能会打包了相同的第三方库.那么在链接的时候就会发生符号冲突. 例如:A厂商提供的lib ...

  4. Android 悬浮窗,绝对是目前相关悬浮窗开源库最完美的适配方案

    PerfectFloatWindow 项目地址:Alonsol/PerfectFloatWindow 简介: android 全局悬浮窗,目前已经适配华为,小米,vivo,oppo,一加,三星,魅族, ...

  5. android button 添加事件_2019最新Android常用开源库总结

    前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...

  6. Android 优秀的开源库

    前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...

  7. Android开源项目以及开源库集合(持续更新中)

    UI Awesome-MaterialDesign – MaterialDesignCenter改名为Awesome-MaterialDesign,优化了布局,新增了不少库. awesome-andr ...

  8. Android常用热门开源库汇总(持续更新)

    原文转载:https://www.yundashi168.com/344.html 请及时关注原文网站,因为后续持续更新都在原网站更新.请多多点赞和关注. 前言 收集了一些比较常见的开源库,特此记录( ...

  9. 2019最新Android常用开源库总结(From:知乎)

    文章目录 一 .基本控件 **TextView** **EditText** **ImageView** **Button** **Spinner** **CheckBox** **ProgressB ...

最新文章

  1. python安装win32api pywin32 后出现 ImportError: DLL load failed
  2. python123第九周测验答案2020_运用python123平台助力编程课教学
  3. ElasticSearch出现java.lang.IllegalStateException: duplicate plugin: - Plugin information:
  4. boost::iterator_facade用法的测试程序
  5. 面向对象写选项卡、拖拽
  6. 表格里面怎么打多个√_Excel怎样在表格里打√?
  7. 我喜欢阅读和计算机英语,关于自考中的计算机专业
  8. JavaScript高级程序设计笔记 - 第四章 变量 作用域 内存问题
  9. Linux telnet命令
  10. 一系列自动化测试的开源项目介绍
  11. Java web 集成使用QQ互联
  12. iphone导出视频 无法连接到设备_爱思助手无法识别设备或者连接超时解决办法...
  13. android手机双开微信方法,微信双开太简单了!学会这几种方法,就能同时登录2个微信...
  14. 计算机vga,电脑启用vga模式是什么意思?怎么修复?
  15. 详解显式intent和隐式intent
  16. 最大传输单元:MTU
  17. mac下用mysql执行sql文件完整
  18. CubeMXIDE 汉化
  19. JAVA的直接内存介绍
  20. 计算机毕业论文致谢信范文,计算机毕业论文致谢

热门文章

  1. ANA 2 优化版含预设 – Sonic Academy ANA 2 Bundle v2.0.94 WiN
  2. Premiere制作字幕怎么去黑色背景
  3. S老师 背包系统 装备系统 锻造系统 学习
  4. AndroidStudio检测不到华为手机
  5. JSAPI 高德地图应用--车辆的轨迹回放、并附有信息框(下)
  6. 最近这个月准备向go发起进攻,有没有hxd一起学习
  7. Java七十四: Java基础/核心知识总结 — — “Java千字文”
  8. MICCAI 2021 | 深圳大学MUSIC医学超声实验室萌新的论文分享!
  9. 【报错】This scheduler instance (xxx) is still active but was recovered by another instance in the...
  10. 闲鱼java系统_闲鱼亿级账户数据迁移的方法