Android新业务弹屏介绍实现

前言

最近项目中用到了新业务弹屏介绍,需要根据一系列条件判断来展示弹屏,下面记录一下如何实现。

首先我们看一下需求是什么样子的,需要根据哪些条件来判断
,更新时间,时间间隔,最大展示次数,
首先从服务端返回一个对象

public class FlashJson implements Serializable {

    private static final String KEY_TATOL_COUNT = "total_";

    private static final String KEY_LAST_UPDATE_TIME = "last_update_time_";

    @SerializedName("update_time")
    public long updateTime;          // 单位是秒
    @SerializedName("start_time")
    public long startTime;           // 单位是秒
    @SerializedName("end_time")
    public long endTime;             // 单位是秒
    //时间间隔
    @SerializedName("spacing")
    public int spacingDays;
    //最大展示次数
    @SerializedName("max_count")
    public int maxCount;
    @SerializedName("id")
    public String id;
    @SerializedName("img")
    public String img;
    @SerializedName("href")
    public String href;
    @SerializedName("event_type")
    public String eventType;

    public String getUrl() {
        return !TextUtils.isEmpty(eventType) ? eventType : href;
    }

然后展示的时候先去判断

   // 是否显示
    public boolean canShow() {

        checkUpdateTime();

        long cur = System.currentTimeMillis() / 1000;
        long lastShowTime = getLastShowTime(id);
        // 在显示的时间获取内, 且未被点击过 或 上次点击时间已超时
        return cur >= startTime && cur < endTime && ((cur - lastShowTime) > getDays() * 24 * 3600
                && getShowCount(id) < maxCount && !TextUtils.isEmpty(img));
    }
 // 检查updateTime 是否变化
    private void checkUpdateTime() {
        long lastUpdateTime = getLastUpdateTime(id);

        // updateTime有改变,移除此id
        if (lastUpdateTime != updateTime) {
            removeShowInfo(id);
        }
    }
public static void removeShowInfo(String id) {
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(id).commit();
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(KEY_TATOL_COUNT + id).commit();
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(KEY_LAST_UPDATE_TIME + id).commit();
    }
  private int getDays() {
        return spacingDays < 0 ? 0 : spacingDays;
    }

展示过以后我们把内容记录一下

public static void addShowTimeRecord(FlashJson flashJson) {
        final String id = flashJson.id;

        long cur = System.currentTimeMillis() / 1000;
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().putLong(id, cur).commit();

        // updateTime
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().putLong(KEY_LAST_UPDATE_TIME + id, flashJson.updateTime).commit();

        // 总次数
        int count = getShowCount(id);
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().putInt(KEY_TATOL_COUNT + id, ++count).commit();
    }
public class FlashJson implements Serializable {

    private static final String KEY_TATOL_COUNT = "total_";

    private static final String KEY_LAST_UPDATE_TIME = "last_update_time_";

    @SerializedName("update_time")
    public long updateTime;          // 单位是秒
    @SerializedName("start_time")
    public long startTime;           // 单位是秒
    @SerializedName("end_time")
    public long endTime;             // 单位是秒
    //时间间隔
    @SerializedName("spacing")
    public int spacingDays;
    //最大展示次数
    @SerializedName("max_count")
    public int maxCount;
    @SerializedName("id")
    public String id;
    @SerializedName("img")
    public String img;
    @SerializedName("href")
    public String href;
    @SerializedName("event_type")
    public String eventType;

    public String getUrl() {
        return !TextUtils.isEmpty(eventType) ? eventType : href;
    }

    // 是否显示
    public boolean canShow() {

        checkUpdateTime();

        long cur = System.currentTimeMillis() / 1000;
        long lastShowTime = getLastShowTime(id);
        // 在显示的时间获取内, 且未被点击过 或 上次点击时间已超时
        return cur >= startTime && cur < endTime && ((cur - lastShowTime) > getDays() * 24 * 3600
                && getShowCount(id) < maxCount && !TextUtils.isEmpty(img));
    }

    private int getDays() {
        return spacingDays < 0 ? 0 : spacingDays;
    }

    // 检查updateTime 是否变化
    private void checkUpdateTime() {
        long lastUpdateTime = getLastUpdateTime(id);

        // updateTime有改变,移除此id
        if (lastUpdateTime != updateTime) {
            removeShowInfo(id);
        }
    }

    // 已展示次数
    private static int getShowCount(String id) {
        return Const.SP_HOME_MAIN_FLASH_SHOW.getInt(KEY_TATOL_COUNT + id, 0);
    }

    public static void addShowTimeRecord(FlashJson flashJson) {
        final String id = flashJson.id;

        long cur = System.currentTimeMillis() / 1000;
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().putLong(id, cur).commit();

        // updateTime
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().putLong(KEY_LAST_UPDATE_TIME + id, flashJson.updateTime).commit();

        // 总次数
        int count = getShowCount(id);
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().putInt(KEY_TATOL_COUNT + id, ++count).commit();
    }

    private static long getLastShowTime(String id) {
        return Const.SP_HOME_MAIN_FLASH_SHOW.getLong(id, 0);
    }

    private static long getLastUpdateTime(String id) {
        return Const.SP_HOME_MAIN_FLASH_SHOW.getLong(KEY_LAST_UPDATE_TIME + id, 0);
    }

    public static void removeShowInfo(String id) {
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(id).commit();
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(KEY_TATOL_COUNT + id).commit();
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(KEY_LAST_UPDATE_TIME + id).commit();
    }

    public static void clearAll() {
        Const.SP_HOME_MAIN_FLASH_SHOW.edit().clear().commit();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值