热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android系统默认弹窗,Android通用业务弹窗管理方案

前言在Android圈里关于弹窗的开源框架还是挺多的,但是大多数扩展都是针对于样式,像是一种类型的弹窗开发者传入不同的参数就能在UI效果上显示不同的特效,这样的扩展的确是十分方便但

前言

在Android圈里关于弹窗的开源框架还是挺多的,但是大多数扩展都是针对于样式,像是一种类型的弹窗开发者传入不同的参数就能在UI效果上显示不同的特效,这样的扩展的确是十分方便但在我们具体工作业务开发中,UI对弹窗样式的追求上

就显得有些鸡肋,基本上业务场景每种类型的弹窗界面效果都大不相同做不到真正意义上的界面统一

这里对于将要介绍的方案 着重的不在于UI效果 而在于 弹窗的业务逻辑

思想理念

得益于markzhai的任务流概念将App初始化的流程抽象为flow、wave和task 三个阶段类别的想法

我整理了弹窗相关的一些类别 (ps:这里的弹窗不再是Dialog通常的概念)

public enum PopType {

DIALOG,

WEBVIEW,

WIDGET,

POUPOWINDOW,

TOAST,

SNACKBAR,

OTHERS

}

我也尝试着将这些繁杂的弹窗统一抽象为一体 也就是本框架中的核心成员之一 —— PopLayerView

它是一个弹窗view但又不继承于View 并且具备原生弹窗show,hide等基本功能

它可以是上面列出的弹窗的任何一种 只需要传入你的具体弹窗策略

框架产于需求终于需求 需求文档里 可能需要你将弹窗延迟固定的时间并消失 一些活动弹窗需要你在具体的时间段失效 又或者是当运营下发多个活动窗口时 该如何满足他们需求的管理这些弹窗

面对上述的这些问题

弹窗就不限于弹窗本身了,它必须具备装配各种业务相匹配的能力

1.时间范围管理 2.显示弹窗次数管理 3.优先级设置 4.显示时间配置

内部维护了 PopLayerController 装配弹窗业务功能的成员来满足这些场景

成员 PopManager 维护了对应的弹窗优先级队列 保证弹窗流程正常进行

综上暂时满足目前的需求,希望这样的思想理念能得到您的赞同

具体使用

具体使用 您可以去 Github:github.com/MrCodeSnipe… 上浏览希望对您有所帮助

//add this to your repositories

maven { url 'https://www.jitpack.io' }

//add this to your dependencies

implementation 'com.github.MrCodeSniper:PopLayer:2.0.0'

关于弹窗管理

这里 我将每个弹窗对象 当成一个弹窗实体 在框架里称为 Popi

它是一个描述窗口的最小不可分割实体 具备所有描述弹窗的属性且可以按照需求扩展

在使用时 只需按照您的需求 装配对应的业务需求即可

Popi mUpgradePopi1 = new Popi.Builder()

.setmPopId(4)//弹窗的唯一标识 当id发生改变 视为新的弹窗

.setmPriority(2)//优先级这里不具体划分对应的范围 值越小优先级越高

.setmCancelType(TRIGGER_CANCEL)//弹窗消失的类型分为 TRIGGER_CANCEL(触摸消失) COUNTDOWN_CANCEL (延时消失)

.setMaxShowTimeLength(5)//最长显示时间(S)

.setMaxShowCount(5)//最大显示次数

.setmBeginDate(1548858028)//开始时间 2019-01-30 22:20:28

.setmEndDate(1548944428)//结束时间 2019-01-31 22:20:28

.setmPopLayerView(mLayerView1)//弹窗View

.build();

之前说过传入具体弹窗策略 创建对应的弹窗

即下文中的传入dialog弹窗的策略 拿到之前统一的View对象交由Popi管理即可

//Dialog形式

PopLayerView mLayerView = new PopLayerView(this,R.layout.common_dialog_upgrade_app);

//透明Webview形式

PopLayerView mLayerView = new PopLayerView(this,LayerConfig.redPocketScheme);

如何实现弹窗优先级的业务逻辑

之前说到 成员 PopManager 维护了对应的弹窗优先级队列 保证弹窗流程正常进行,最后的显示和隐藏也是在其操作之后

首先Popi实体实现了Comparable接口 使其具备通过优先级比较大小的能力

其次也就是内部的优先级队列 每添加删除一个元素都会进行堆排序对队列进行优先级调整

private PriorityQueue queue;

当弹窗实体Popi入队中 会先通过判断其Id是否重复 来判断是否将其入队

在显示时根据传入的Popi对应的属性依次判断其是否满足

1.在限定的活动时间内

2.通过SP保存相应弹窗的显示次数 key为Popi加上其唯一的ID 判断显示次数是否超出范围

3.如果取消类型为延迟取消 增加DelayDimiss

若流程无法走出的弹窗实体会被移出队列

具体的使用也非常简单

//纳入弹窗管理

PopManager.getInstance().pushToQueue(mUpgradePopi);

//开始显示弹窗

PopManager.getInstance().showNextPopi();

效果预览

f47d6e8470cf1aeae8d9db9287e0b6f8.gif

框架目前的缺陷

目前还没有好的方法来监听原生的控件消失的回调

类似dialog 点击圈外时 是不走我们的消失逻辑的

需要加上监听 但这使得内部逻辑有些紊乱

目前的解决办法是 统一弹窗的 触摸机制 分为实体和外围区域 将其纳入我们的管理范围内

随着V2的发布 触摸机制 已经有默认不同扩展的实现 基本上实现统一

关于项目

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策略扩展完成

未来的计划

基于透明的Webview的扩展已经完成 各位看官可以去

其他类型的弹窗也会陆续更新 希望能提供给大家一个较为全面的应对业务需求的弹窗管理框架

作者介绍

Hello 我叫lalala,如果您喜欢我的文章,可以去我的Github给个Star我就很开心啦!

--End



推荐阅读
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • WCF类型共享的最佳实践
    在使用WCF服务时,经常会遇到同一个实体类型在不同服务中被生成为不同版本的问题。本文将介绍几种有效的类型共享方法,以解决这一常见问题。 ... [详细]
  • 题目描述:牛客网新员工Fish每天早上都会拿着一本英文杂志,在本子上写下一些句子。他的同事Cat对这些句子非常感兴趣,但发现这些句子的单词顺序被反转了。例如,“student. a am I”实际上是“I am a student.”。Cat请求你帮助他恢复这些句子的正常顺序。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
author-avatar
美玲珍任欢治
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有