• 混合开发管理 用户可自定义
•  */
 public interface HybirdManager {
//注入JSBridge 时机在onreceivetitle
 void injectJsBridge(WebView webView,String jsName);//调用本地提供的基础服务 时机 1.jsprompt 2.post请求 3.原生 4.shouldOverrideUrlLoading
 void invokeAppServices(String instruction) ;//加入JS中android本地对象 时机webview初始化
 void addUpJavaNativeJSInterface(WebView webView, String windowObjName);}

对于Webview弹窗来说与JS的交互是不可缺少的,市面上有许多与JS交互的框架,Android同样有着原生支持,支持用户自定义与弹窗交互的方式,也同样提供了基于JSBridge和原生的默认交互实现,可根据业务与喜好择一使用

这里为了说明方便将下文的交互概念稍微统一

原生调H5为提供基础扩展,同理H5调原生为调用基础服务

中提供了默认的基础服务组件 PopWebViewService

主要包含弹窗 显示和消失等基本功能 和适合各个项目的统一路由服务

当网页显示的时候 我们可以在web调试器console中看到DOM对象的属性

PS: 这里的路由 JS传的是调用客户端服务的基础协议 这个协议由jsbridge内部形成 类似结构router://type=xxx?value=yyy,是由用户根据其业务决定的

内置JSbridge

框架中已经内置了Jsbridge,这里就不贴出代码一一说明了

简单的放一张原理图阐述双端的交互机制

注入时机

框架在这里采取在加载完头部标题时注入的机制

@Override
 public void onReceivedTitle(WebView view, String title) {
 //注入JSBridge的时机
 if(mHybirdImpl!=null){
 mHybirdImpl.injectJsBridge(view,jsBridgeName);
 }
 super.onReceivedTitle(view, title);
 }

根据考拉团队的做法

通过设置加载阈值 在监听WebViewClient.onProgressChanged()函数时根据进度来注入也是可行的

回调服务时机

考虑到现今WebView的回调特点, 尽可能全面的在四种方案回调了基础服务接口 并在下面分析了各自的优缺点,用户可择其使用

1.JsPrompt

侵入WebChromeClient.onJsPrompt(webview, url, message, defaultValue, result)实现通信。

优点 返回值类型多样 消息长度上限高

缺点 可能需要处理弹窗问题

2.拦截JS Post请求

优点 通过请求来做操作 可以进行鉴权加密 提高安全性

缺点 请求体body里的内容android端无法接收到(IOS是可以拿到的)

3.Native函数也接收回调

优点 使用方便 管理方便

缺点 容易被反编译 拿到服务信息

4.ShouldOverrideUrlLoading拦截跳转

优点 前端用方便 location.href即可

缺点 有些机型此函数是无法生效的

最终回调服务都通往HybirdManager接口的invokeAppServices函数,回收到命令字符串

public void invokeAppServices(String instruction) {
 //收到字符串格式的命令分为两种类型1.路由
 Uri uri=Uri.parse(instruction);
 if(uri.getscheme().equals(routerScheme)){
 doRouter(instruction);
 }else{
 //2.jsbridge中取出的 函数体调用式JSON
 //类似{“invokeId”:“name_2_1549953808581”,“methodName”:“name”,“methodParams”:“123”}
 //此函数需要解析此json调用基础服务对象的对应方法
 doInvokePopWebviewService(instruction);
 }}

3.配置了弹窗管理Callback 方便用户监听弹窗管理过程

public interface PopCallback {
//弹窗已经存在于队列中
 void onPopExisted(int queueSize);//弹窗不在活动时间内
 void onPopOutOfDate();//弹窗已经显示了最大个数
 void onPopShowMaxCount();//弹窗显示成功回调
 void onPopShowSuccess();//弹窗延迟消失回调
 void onPopDelayDismiss();}

弹窗效果预览

JS交互效果预览

因为是手机录的屏 依次按顺序发送命令 最终回调invokeService里显示弹窗

特效展示(红包雨)

关于项目

PoupoLayer

一个通用的Android端弹窗管理框架,内部维护弹窗优先级队列 具备弹窗管理扩展功能 整合Dialog,PoupoWindow,悬浮Widget,透明Webview,Toast,SnackBar,无需再为繁琐的业务弹窗逻辑所困扰

具体如何使用 可以去github.com/MrCodeSnipe…阅读下面的使用说明文档

您也可以下载Demo体验一番 如有问题 可以在Github上打开Issue或在掘金评论或者私密

V1方案

版本号

LOG

进度更新

V1.0.0

项目开源,完成弹窗管理与Dialog形式扩展

Dialog策略扩展完成

V1.0.1

修复Dialog策略无法获取dialog实体bug

Dialog策略优化

V1.0.2

修复activity摧毁造成的弹窗异常 bug

Dialog策略优化

V1.0.3

优化了弹窗的使用更加方便快捷

框架使用优化

V2方案

版本号

LOG

进度更新

V2.0.0

正式加入透明Webview弹窗策略扩展

透明Webview策略扩展完成

接下来的计划

总结

本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!