前言
-
相信很多朋友都曾接到过App启动进行弹窗的需求,或广告或引导,加上现在管控力度的提升,App被要求加入个人信息隐私弹窗和青少年模式弹窗的越来越多,导致一大堆弹窗堵在了App启动时,这个时候我们就需要列好优先级,再结合业务场景进行展示。
示意图1.jpg
![](https://img.haomeiwen.com/i2764754/aa4dde736a2215ab.jpg)
![](https://img.haomeiwen.com/i2764754/14a283df34b8ae2d.jpg)
1. 确定方案
- 首先App启动时弹窗过多会造成一定的用户流失,所以我们只把必须的弹窗放在启动时,其他的尽量延后,然后按照优先级逐一展示
- 弹窗我建议使用DialogFragment,方便生命周期管理,可以按照App风格封装一个通用弹窗
- 既然弹窗是逐一进行展示,我们不禁想到的数据结构就是队列,这里我们使用ArrayDeque
2. 实践
public abstract class BaseStartupPop {
private boolean once = true; // 这里用来判断是否每次都要检查
protected abstract void doShow();
protected void finish() {
if (hasNext()) {
next().show();
}
}
}
先把公用方法放到一个基础类里
public class InfoProtectStartupPop extends BaseStartupPop {
@Override protected void doShow() {
if(xxx) {
showDialog();
} else {
finish();
}
}
}
拿个人信息保护弹窗举例,我们在doShow方法里判断弹窗的条件,条件满足则展示,不满足则finish进行下一步,当然弹窗dismiss后别忘了也要调用finish进行下一步,然后我们需要一个管理类来管理这个队列
public class StartupPopManager {
private Queue<StartupPop> queue;
public void addPop(Queue<StartupPop> queue) {
this.queue = queue;
}
public void start() {
if(queue.isEmpty()) return;
next().show();
}
public StartupPop next() {
return queue.poll();
}
}
最后我们只需要在初始化的时候将所有StartupPop添加到队列里,然后调用start方法即可
private Queue<StartupPop> queue = new ArrayDeque<>();
queue.offer(new InfoProtectStartupPop());
***
***
StartupPopManager.getInstance().addPop(queue);
StartupPopManager.getInstance().start();
总结
其实这种业务需求有很多种做法,这只是其中的一种,通过一个队列来逐个进行实现,更方便管理,代码更加的简洁易懂。
网友评论