Android 通用业务弹窗管理方案 V2,hashmap 扩容过程
事件分发到 onTouchEvent 即可根据回调的状态 设置拦截还是分发事件给 native
PS: 考虑到业务场景的不同 定制程度比较高的应用 建议实现属于自己的扩展
(这里存在的问题是动态特效弹窗详情下,触摸会出现卡顿,各位大佬如果有更好的方案,请在评论区留下您宝贵的建议)
2.默认内置 JS 原生交互方式
/**
混合开发管理 用户可自定义*/public interface HybirdManager {
//注入 JSBridge 时机在 onreceivetitlevoid injectJsBridge(WebView webView,String jsName);
//调用本地提供的基础服务 时机 1.jsprompt 2.post 请求 3.原生 4.shouldOverrideUrlLoadingvoid 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,这里就不贴出代码一一说明了
简单的放一张原理图阐述双端的交互机制
注入时机
框架在这里采取在加载完头部标题时注入的机制
@Overridepublic 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(r
outerScheme)){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 或在掘金评论或者私密
评论