安卓中弹窗优先级管理方案

文章介绍了一种在Android开发中管理多个弹窗的方法,通过创建BaseSyncTask抽象类和SyncTask接口来实现弹窗任务的队列管理。当有新的弹窗需要显示时,会根据预设的优先级顺序进行展示。在弹窗关闭时,会自动执行下一个优先级的弹窗任务。
摘要由CSDN通过智能技术生成

    在开发过程中,弹窗是APP重要组成部分!可能会遇到有很多弹窗,如果一下都全部都弹出来,用户体验很不好!这个时候就需要管理弹窗优先级了,让弹窗按照设定好的优先级有序的弹出来。

        首先创建任务抽象基类BaseSyncTask,如下:

      

public abstract class BaseSyncTask implements SyncTask{

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }


    @Override
    public boolean equals(Object obj) {//用来去重
        //自反性
        if (this == obj) return true;
        //任何对象不等于null,比较是否为同一类型
        if (!(obj instanceof BaseSyncTask)) return false;
        //强制类型转换
        BaseSyncTask baseSyncTask = (BaseSyncTask) obj;
        //比较属性值
        return getId() == baseSyncTask.getId();
    }
}

此类实现自定义的接口SyncTask,此接口定义了一个方法doTask,如下

public interface SyncTask {
    void doTask();

}

下面是使用方法:

  封装两个方法,一个是加入队列,一个是执行队列

  

//对话框任务队列
private val pendingQueue: java.util.ArrayDeque<BaseSyncTask> = ArrayDeque()
private var mCurrentTask: BaseSyncTask? = null
/**
 * 进入对话框任务队列
 *
 * @param task
 * @param taskId
 * @param isToFirst
 */
fun enqueue(task: BaseSyncTask, taskId: String?, isToFirst: Boolean, canRepeat: Boolean) {
    task.id = taskId
    JKXLog.d("OneByOne:The task id = :" + task.id)
    JKXLog.d("activityCoverOneByeOne", "The task id = :" + task.id)
    if (!canRepeat) {
        pendingQueue.remove(task) //通过是否可重复,去重,防止有误操作造成两个相同的对话框
    }
    if (isToFirst) {
        pendingQueue.offerFirst(task) //the ArrayDeque should not be blocked when operate offer
    } else {
        pendingQueue.offer(task) //the ArrayDeque should not be blocked when operate offer
    }
    JKXLog.d("OneByOne:The pendingQueue", "size = :" + pendingQueue.size)
    JKXLog.d("activityCoverOneByeOne", "The pendingQueue size = :" + pendingQueue.size)
    if ( mCurrentTask == null) { //任务执行时,mBeActivityAppPoped为false时,依赖于活动APP首页弹窗接口的完成
        JKXLog.d("activityCoverOneByeOne", "此时没有红包雨,单独执行任务")
        coreExecute()
    }
}

/**
 * 执行对话框任务队列
 */
private fun coreExecute() {
    if (PageUtil.isLive(this)) {
        mCurrentTask = pendingQueue.poll()
        if (mCurrentTask != null) {
            JKXLog.e("OneByOne:executing currentTask", "id = :" + mCurrentTask!!.id)
            JKXLog.d("activityCoverOneByeOne", "executing currentTask id = :" + mCurrentTask!!.id)
            JKXLog.d("activityCoverOneByeOne", "----------------------end----------------------")
            mCurrentTask!!.doTask()
        }
    }
}

最后在需要管理弹窗的位置调用enque方法加入队列,如下:

//弹出个人信息授权说明弹窗
enqueue(object : BaseSyncTask() {
    override fun doTask() {
        showPersonPriDialog()
    }
}, HomeAppPopConstant.DIALOG_PER_PRI_KEY, true, false)

注意:在弹窗关闭的时候,需要执行 mCurrentTask=null  和coreExecute()方法,以便执行下个弹窗逻辑

HomeAppPopConstant代码如下:

public class HomeAppPopConstant {
    public final static String DIALOG_PER_PRI_KEY = "1";//个人信息授权政策
    public final static String DIALOG_ORDER_KEY = "2";//待支付弹窗
    public final static String DIALOG_MINIPROGRAM_KEY = "3";//小程序弹窗
}

字符串数字从1-3,优先级降低

一个通用的Android弹窗管理框架,内部维护弹窗优先级队列 具备弹窗管理扩展功能 整合Dialog,PoupoWindow,悬浮Widget,透明Webview,Toast,SnackBar,无需再为繁琐的业务弹窗逻辑所困扰如何添加依赖只需要两行代码轻松接入//add this to your repositories  maven { url 'https://www.jitpack.io' } //add this to your dependencies implementation 'com.github.MrCodeSniper:PopLayer:2.0.0'具体如何使用1.根据策略创建对应的弹窗view//Dialog形式 PopLayerView  mLayerView = new PopLayerView(this,R.layout.common_dialog_upgrade_app); //透明Webview形式 PopLayerView mLayerView = new PopLayerView(this,LayerConfig.redPocketScheme);2.开始装配弹窗配置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                 .setLayerView(mLayerView)//弹窗View                 .build();3.纳入弹窗管理//纳入弹窗管理 PopManager.getInstance().pushToQueue(mUpgradePopi); //开始显示弹窗 PopManager.getInstance().showNextPopi();效果预览未来的计划逐步统一 其他类型的弹窗 希望能提供给大家一个较为全面的应对业务需求的弹窗管理框架版本记录V1方案版本号LOG进度更新V1.0.0项目开源,完成弹窗管理与Dialog形式扩展Dialog策略扩展完成V1.0.1修复Dialog策略无法获取dialog实体bugDialog策略优化V1.0.2修复activity摧毁造成的弹窗异常 bugDialog策略优化V1.0.3优化了弹窗的使用更加方便快捷框架使用优化V2方案版本号LOG进度更新V2.0.0正式加入透明Webview弹窗策略扩展透明Webview策略扩展完成作者介绍Hello 我叫lalala,如果您喜欢这个项目 请给个star 能follow我那真是太好了!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值