APP中弹窗统一管理的思考
背景
在项目的开发过程中,我们会碰到各种各样的弹窗,特别是启动的时候有许多弹窗都是需要显示的。在这种情况下,我们就需要对弹窗进行统一的管理,否则会出现弹窗重叠显示的问题,以及相互依赖的弹窗弹出的顺序不正确的问题或者同一弹窗会多次显示的问题。基于以上的原因,我们有必要对弹窗进行统一的管理。
目标
- 可以给所有的弹窗设置优先级
- 根据优先级排序,顺序展示各个弹窗
- 支持给弹窗设置TAB限制
- 对于支持Native和Flutter的弹窗,统一由Native管理
思考
- 由于要排序,所以要求启动的时候就把不限制Tab以及首页的弹窗加入队列
- 支持切换Tab,根据当前的Tab限制过滤展示的弹窗,且要重新从头开始执行
- 每个弹窗都指定一个固定且唯一的标识,用于处理弹窗重复的问题
- 添加到队列中的弹窗可以预先请求数据并缓存,若不需要展示可以提前告知Manager,在执行到对应弹窗时,直接跳过
- 执行到某个弹窗时,根据请求结果确定是否展示
方案设计
- 弹窗所需要的属性
// 弹窗所需要的属性
public class PopWrapper {
// 弹窗类型,即唯一标识码
private String popId;
// 弹窗描述
private String name;
// tab限制
private Tab tab;
// 优先级
private int priority;
// 是否显示
private Boolean isShow;
// 是否显示过
private Boolean isShowed;
}
// Tab的类型,可根据业务不同自行修改
enum Tab {
none, // 不限制
home, // 首页
mine, // 我的
}
- Manger的主要方法
// 初始化的时候向Manager添加弹窗
addPops(List<PopWrapper> pops)
// 设置对话框是否需要显示
isShowPop(PopWrapper pop, Boolean show)
// 对话框展示结束
endShow(PopWrapper pop)
// 切换Tab,并添加需要展示的新弹窗
switchTab(Tab tab, List<PopWrapper> pops)
// 重新开始执行
resumeShow()
// 挂起
suspendShow()