Android Studio 实现答题后次日同时间解锁Activity 定时任务咨询
答题锁定功能实现思路
这个需求核心是时间差校验,不需要依赖复杂的定时调度任务主动修改状态,根据你的业务风控要求可以选择以下两种实现方案:
方案1:客户端本地实现(低风控场景适用)
适合仅需前端做权限控制、没有强防作弊要求的场景,实现成本极低:
- 用户完成答题后,将
created_at对应的时间戳持久化到本地存储(Android用SharedPreferences、iOS用UserDefaults、小程序用storage API) - 每次用户触发进入答题Activity的操作时,先做本地校验:
- 无上次答题时间记录直接放行
- 有记录的情况下,计算当前时间和上次答题时间的差值,差值≥86400秒(24小时)则允许进入,否则弹出锁定提示
- 优化点:如果要避免用户修改本地时间绕过校验,可以在APP启动时同步一次服务端时间,用服务端返回的时间做差值计算
Android端代码示例:
// 答题完成后存储时间 val sp = getSharedPreferences("answer_config", Context.MODE_PRIVATE) sp.edit().putLong("last_answer_ts", System.currentTimeMillis() / 1000).apply() // 进入答题页前校验逻辑 val lastAnswerTs = sp.getLong("last_answer_ts", 0) // 有服务端同步时间就替换下面的当前时间取值 val currentTs = System.currentTimeMillis() / 1000 if (currentTs - lastAnswerTs >= 24 * 3600) { // 放行进入答题页面 startActivity(Intent(this, AnswerActivity::class.java)) } else { Toast.makeText(this, "答题功能次日同一时间解锁", Toast.LENGTH_SHORT).show() }
方案2:服务端实现(高风控场景适用)
适合需要防作弊、数据一致性要求高的场景,完全避免客户端篡改问题:
- 用户完成答题后,将
created_at字段写入对应用户的数据库答题记录 - 客户端每次尝试进入答题页前,先调用服务端的权限校验接口
- 服务端取出该用户最近一次答题的
created_at时间,和当前服务端时间做差值计算,返回是否允许访问的标识,以及剩余的解锁时间(可选)
可选:主动触发定时任务的实现
如果需要在用户解锁时间到达后主动执行逻辑(比如给用户发解锁推送、发放答题奖励),再考虑引入定时调度:
- 轻量实现:用户完成答题后,向延迟消息队列发送一条延迟24小时的消息,消费端收到消息后执行对应逻辑即可
- 单体应用可直接用内置定时任务池,提交延迟24小时的任务,注意要做任务持久化避免应用重启后任务丢失
- 分布式场景可使用XXL-Job、Quartz等定时任务框架,定时扫表处理到达解锁时间的用户即可
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

