应用弹窗优先级

背景

由于活动业务越来越多,积累的弹窗越来越多和杂乱,出现如下弹窗交互问题:

  • 弹窗无限重叠,影响操作

  • 弹出顺序无优先级,重要弹窗被隐藏

原因相信大家都一样,产品是一次次迭代的,也可能是不同人开发的,两个毫不相关的业务,弹窗时机也没有任何关联,重不重叠我怎么控制呀

首先来分析一下我们的预期

经过总结后,我想要的弹窗效果如下:

  • 短时间内弹出多个弹窗情况下,一次只能显示一个,其他的都加到队列里等待;
  • 下一个弹窗弹出的时机,是在当前弹窗关闭之后;
  • 队列中的弹窗不是无限等待的,超时后不能显示(出队列的时间-入队列的时间,超时时间可设置)
  • 队列中的弹窗显示按照优先级排列(可设置优先级)

当然,除了满足上面的业务条件外,对当前代码的侵入性,代码可靠性也同样重要,不然改了一顿之后上线都是bug,那这个就得不偿失了;

设计阶段

为了后续开发清晰,我总结了一个流程图

设计DialogManager类:

定义需要的结构

object DialogShowManager {

    //弹窗等待队列
    private val mQueueList by lazy { LinkedList<ConfigDialogFragment>() }

    //优先级计算
    private var mComparator = Comparator<ConfigDialogFragment> { e1, e2 -> e2.config.priority - e1.config.priority}

    //当前正在显示的dialog
    private var mCurrentDialog:ConfigDialogFragment? = null

//....

}

定义显示dialog的入口方法:

fun addDialog(dialog: DialogFragment, fragmentManager: FragmentManager?, flags: Int, config: DialogShowConfig) {
        log("addDialog::${dialog.javaClass.simpleName}")
        val configDialog = ConfigDialogFragment(dialog, fragmentManager,flags, config.apply { joinTime = System.currentTimeMillis()})
        if (mCurrentDialog == null) {
            showDialogInternal(configDialog)
            return
        }
        log("addDialog add to queue::${dialog.javaClass.simpleName}")
        mQueueList.add(configDialog)
        Collections.sort(mQueueList, mComparator)
    }

显示dialog,如果当前没有正在显示的弹窗,则直接进入显示弹窗;如果有,则直接加入队列;

显示弹窗内部逻辑:

private fun showDialogInternal(dialogFragment: ConfigDialogFragment) {
        log("showDialogInternal::${dialogFragment.dialog.javaClass.simpleName}")
        mCurrentDialog = dialogFragment
        mCurrentDialog?.dialog?.lifecycle?.addObserver(mDialogObserver)
        Navigator.showDialog(dialogFragment.dialog, dialogFragment.fragmentManager, dialogFragment.flags)
    }

注意,显示之前,为当前弹窗添加了lifecycleObserver,用来监听弹窗的生命周期;

Navigator.showDialog为内部封装显示dialogFragment的方法;

当前弹窗的生命周期监听:

private val mDialogObserver = object: LifecycleObserver {

        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        fun onCreate(owner: LifecycleOwner) {
            log("mDialogObserver::onCreate")
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy(owner: LifecycleOwner) {
            log("mDialogObserver::onDestroy")
            mCurrentDialog?.dialog?.lifecycle?.removeObserver(this)
            mCurrentDialog = null
            showNextDialog()
        }
    }

 因为注册了lifecycleObserver,所以在这里可以监听到弹窗的开启和关闭,在关闭时清空当前弹窗并执行显示下一个弹窗的逻辑

显示下一个弹窗:

private fun showNextDialog() {
        log("showNextDialog")
        while (true) {
            val dialog = mQueueList.poll() ?: return
            log("showNextDialog::isTimeout::${dialog.isTimeout()},::${dialog.dialog.javaClass.simpleName}")
            if (!dialog.isTimeout()) {
                showDialogInternal(dialog)
                return
            }
            continue
        }

    }

 找到队列里下一个未超时的弹窗,并进入执行显示逻辑

 这样,业务里弹窗时,只需要调用DialogShowManager.addDialog即可,传入需要显示的dialog和优先级配置等;

此方案的优点是侵入性小,没有复杂的判断逻辑,健壮性好,只使用少量的代码即实现了预想的方案;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/662648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ozon卖家精灵,ozon卖家怎么使用

在跨境电商的浪潮中&#xff0c;OZON作为俄罗斯领先的电商平台&#xff0c;吸引了众多卖家争相入驻。然而&#xff0c;面对日益激烈的市场竞争&#xff0c;如何提升店铺的运营效果&#xff0c;成为卖家们迫切需要解决的问题。而OZON卖家精灵作为一款专为OZON卖家打造的辅助工具…

Lua的几个特殊用法

&#xff1a;/.的区别 详细可以参考https://zhuanlan.zhihu.com/p/651619116。最重要的不同就是传递默认参数self。 通过.调用函数&#xff0c;传递self实例 通过 &#xff1a; 调用函数&#xff0c;传递self (不需要显示的传递self参数&#xff0c;默认就会传递&#xff0c;但…

ROS | C++和python实现发布结点和订阅结点

发布者结点&#xff1a; 代码实现&#xff1a; python: C: C和Python发布结点的差异&#xff1a; python: 发布结点pub 大管家rospy调用publisher函数发布话题 (话题,类型&#xff0c;话题长度&#xff09; C: 先定义一个大管家&#xff1a;NodeHandle 然后大管家发布话题…

【C++】二维前缀和

1.题目 2.算法思路 和一维前缀和的方法类似&#xff0c;我们需要预处理一个求和矩阵&#xff0c;然后再求和。 下面是模板&#xff1a; 上面两张图片总结出来了两个公式&#xff0c;这是解决此类问题的关键。 3.代码 #include <iostream> using namespace std; #incl…

【车载开发系列】Vector工具链的安装

【车载开发系列】Vector工具链的安装 【车载开发系列】Vector工具链的安装 【车载开发系列】Vector工具链的安装一. VectorDriver二. DaVinci_Developer三. DaVinci Configurator 一. VectorDriver Vector Driver Setup是Vector产品链中重要的驱动软件,所有的硬件设备进行连接…

看看最新的B端登录界面,你是不是被潮流抛弃了?

毛玻璃风格&#xff08;Frosted Glass Style&#xff09;是新拟态设计风格中的一种分支&#xff0c;它灵感来源于现实世界中的毛玻璃材质。毛玻璃是一种通过在玻璃表面加工处理的方式&#xff0c;使其具有模糊、云翳和透明效果的特殊玻璃。 在设计中&#xff0c;毛玻璃风格通常…

PS:电子书App自动截图后合成一个PDF文档

说明&#xff1a;有的电子书App不能下载到本地&#xff0c;通过自动截图后合成一个PDF文档来解决&#xff01; 一、自动截图App 1.安装”免ROOT自动化助手“ 2.创建一个任务 3.编辑任务&#xff1a;根据电子书的操作顺序制定&#xff0c;400次就是书籍页数&#xff08;次数一…

备份服务器的安全风险以及如何通过TDE透明加密提升安全性

备份服务器的潜在安全风险主要包括以下几个方面&#xff1a; 1. 数据泄露风险&#xff1a; 备份数据可能包含敏感信息&#xff0c;如用户个人信息、商业机密等。如果备份数据未经适当保护&#xff0c;例如存储在不安全的位置或未加密&#xff0c;黑客或未授权的人员可能会获取…

React-基础样式控制

组件基础样式方案 React组件基础的样式控制有两种方式 1、行内样式&#xff08;不推荐&#xff09; 属性名是多个单词的需要使用驼峰写法 也可以把样式都提取到一个变量里&#xff0c;再赋值到style里 2、class类名控制 classnames优化类名控制 classnames是一个简单的JS库&…

【揭秘!在线ChatGPT神器,体验入口在此!】

&#x1f680;【揭秘&#xff01;在线ChatGPT神器&#xff0c;体验入口在此&#xff01;】&#x1f680; 前言 嘿&#xff0c;大家好&#xff01;今天我要和大家分享一些关于如何使用免费的ChatGPT的技巧。ChatGPT是一项令人兴奋的人工智能技术&#xff0c;它可以成为我们的好…

沃飞长空总部落地成都高新,为蓉低空经济发展助力!

5月25日&#xff0c;吉利科技集团与成都高新区签署合作协议&#xff0c;吉利科技集团旗下沃飞长空全球总部落地成都高新区。 根据协议&#xff0c;沃飞长空全球总部项目落地成都未来科技城&#xff0c;将布局总部办公、研发和生产制造低空出行航空器等业务。双方将积极发挥各自…

MySQL第六次作业

一、创建部门表 指令&#xff1a; mysql> CREATE TABLE dept (-> dept_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 部门编号,-> dept_name CHAR(20) COMMENT 部门名称-> ); 演示&#xff1a; 二、插入部门数据 指令&#xff1a; mysql> INSERT INTO dept…

如何使用GPT-4o?如何使用 GPT-4o API?

如何使用GPT-4o&#xff1f; GPT-4o 也可以通过 ChatGPT 界面使用 如何使用 GPT-4o API 新的 GPT-4o 模型遵循 OpenAI 现有的聊天完成 API&#xff0c;使其向后兼容且易于使用。 ​ 如何升级GPT4Plus&#xff1f; 升级ChatGPTPLSU4需要一张虚拟卡&#xff0c;点击获取​​​…

vue项目集成萤石云在Web系统中实现实时摄像头监控及控制功能

需求 需求&#xff1a; 开发人员在产线上放置一个萤石摄像头&#xff0c;前端在可视化大屏上实时监控&#xff0c;且控制左右上下功能。 效果 萤石云接入web前期准备工作 阅读萤石云API文档&#xff1a;萤石云开放平台开发者文档 阅读萤石云控制API文档&#xff1a;萤石云摄…

企业电脑加密系统是如何发展的,今天最可靠的电脑加密系统是什么

企业电脑加密系统历经了几十年的发展&#xff0c;如今技术已经逐渐成熟&#xff0c;加密强度和防泄密效果越来越显著&#xff0c;那么它是怎么发展的&#xff0c;以及当今使用的加密技术是什么呢&#xff1f; 一、发展历程 1.早期探索阶段&#xff1a; 时间&#xff1a;上世纪…

SELINUX=enforcing时无法启动httpd服务的解决方案(semanage命令以及setroubleshoot-server插件的妙用)

一、问题描述&#xff1a; 当/etc/selinux/conf被要求必须是SELINUXenforcing&#xff0c;不被允许使用setenforce 0宽松模式 我们启动httpd就会报错&#xff1a; Job for httpd.service failed because the control process exited with error code. See "systemctl s…

在outlook的邮件中插入HTML;HTML模板获取;页面组态手动生成HTML

本文介绍如何在outlook发送邮件时&#xff0c;在邮件中插入HTML&#xff0c;此HTML可以从获取模板自行进行修改。 文章目录 一、下载HTML模板&#xff08;或自己制作好HTML文件&#xff09;二、outlook新增宏三、新建邮件&#xff0c;插入HTML四、通过图像化页面组态手动生成HT…

sprongboot+vue 游泳馆管理系统

游泳馆管理系统 spring bootvue 主要有游泳课程预约、网上购票、教练预约、游泳器材管理、会员管理等功能&#xff1b; 1、管理员 登录、修改密码 购票管理&#xff1a;查看订单、删除订单、修改订单 教练管理&#xff1a;教练信息查询、修改 课程信息&#xff1a;增删改查课程…

2024-5-29 石群电路-17

2024-5-29&#xff0c;星期三&#xff0c;17:26&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴.今天又是阳光明媚的一天&#xff0c;没有什么特别的事情发生&#xff0c;给女朋友做了好吃的&#xff0c;吃了西瓜&#xff0c;加油学习&#xff0c;嘻嘻嘻~~~~ 今…

JVM之垃圾判断的详细解析

垃圾判断 垃圾介绍 垃圾&#xff1a;如果一个或多个对象没有任何的引用指向它了&#xff0c;那么这个对象现在就是垃圾 作用&#xff1a;释放没用的对象&#xff0c;清除内存里的记录碎片&#xff0c;碎片整理将所占用的堆内存移到堆的一端&#xff0c;以便 JVM 将整理出的内…