WebView开源库终极学习方案

本文介绍了基于腾讯x5的开源库如何显著提高webView开发效率,涵盖了js交互、进度跟踪、视频支持、文件操作、异常处理等功能,并提供了案例展示和常见类的详细说明。此外,还给出了使用建议和常见问题解决方案,适合学习和实践webView开发。
摘要由CSDN通过智能技术生成
  • 基于腾讯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基础知识点
  • 01.常用的基础介绍
  • 02.Android调用Js
  • 03.Js调用Android
  • 04.WebView.loadUrl(url)流程
  • 05.js的调用时机分析
  • 06.清除缓存数据方式有哪些
  • 07.如何使用DeepLink
  • 08.为什么WebView那么难搞
  • 09.如何处理加载错误
  • 10.应用被作为第三方浏览器打开
  • 11.理解WebView独立进程
  • 12.使用外部浏览器下载
  • 13.tel,sms等协议用法
  • 更多内容看wiki

02.如何使用

2.1 如何引入

implementation ‘cn.yc:WebViewLib:1.2.0’

2.2 最简单使用

X5WebUtils.init(this);

<可以使用ProgressWebView
android:id=“@+id/web_view”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:scrollbarSize=“3dp” />

//主要是在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

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
}
};

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
}
});

//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
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页面异常状态区分类型

@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 该库流程图
  • 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”方法。

更多面试题

**《350页前端校招面试题精编解析大全》**内容大纲主要包括 HTML,CSS,前端基础,前端核心,前端进阶,移动端开发,计算机基础,算法与数据结构,项目,职业发展等等

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

CallBackFunction());这是Java层主动调用Js的”updateAttentionStatus”方法。

更多面试题

**《350页前端校招面试题精编解析大全》**内容大纲主要包括 HTML,CSS,前端基础,前端核心,前端进阶,移动端开发,计算机基础,算法与数据结构,项目,职业发展等等

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-JX2EEUjT-1714166405416)]

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值