Android编程:如何限制Activity时段访问及游戏每日游玩次数?
问题1:如何在Android中通过代码设置,限制某个Activity仅在每日特定时段可被打开?
要实现这个需求,核心就是实时判断当前时间是否在允许的区间内,再决定是否让Activity正常启动。这里给你两种实用的实现方式,以及需要留意的细节:
方式一:在跳转前做判断
比如用户点击按钮要打开目标Activity时,先检查时间,符合条件再跳转:btnOpenRestricted.setOnClickListener { val calendar = Calendar.getInstance() val currentHour = calendar.get(Calendar.HOUR_OF_DAY) // 设定允许的时段:比如9:00到18:00 val allowedStart = 9 val allowedEnd = 18 if (currentHour in allowedStart until allowedEnd) { startActivity(Intent(this, RestrictedActivity::class.java)) } else { Toast.makeText(this, "该功能仅在每日9:00-18:00开放", Toast.LENGTH_LONG).show() } }方式二:在目标Activity内部判断
这种方式更稳妥,能防止用户通过深链接等其他途径绕过跳转前的检查:class RestrictedActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val calendar = Calendar.getInstance() val currentHour = calendar.get(Calendar.HOUR_OF_DAY) val allowedStart = 9 val allowedEnd = 18 if (currentHour < allowedStart || currentHour >= allowedEnd) { Toast.makeText(this, "该功能仅在每日9:00-18:00开放", Toast.LENGTH_LONG).show() finish() // 直接关闭Activity,不让用户看到界面 return } // 正常加载界面 setContentView(R.layout.activity_restricted) } }
额外提醒:
- 如果业务要求用统一时区(比如服务器时区),别依赖用户本地时间,应该请求服务器获取当前时间再判断,避免用户改系统时间绕过限制。
- 要是需要更精细的时段控制(比如到分钟),可以同时获取
Calendar.MINUTE,把小时和分钟转换成总分钟数再对比就行。
问题2:设置用户每日仅可游玩3次,满3次弹出提示
这个需求需要持久化记录用户的当日游玩次数,并且每天自动重置计数,用SharedPreferences来实现最方便(轻量、易操作),具体逻辑和代码如下:
核心思路:
- 用户点击"开始游戏"时,先读本地存储的最后游玩日期和当日游玩次数。
- 对比当前日期和记录的日期:
- 日期不同:说明是新的一天,把次数重置为1,同时保存新日期。
- 日期相同:检查次数是否到3次,满额就弹提示,没满就把次数加1再保存,然后进入游戏。
代码实现:
// 在游戏入口的Activity或Fragment里写这个点击事件处理方法 fun onStartGameClicked() { val prefs = getSharedPreferences("GameLimits", Context.MODE_PRIVATE) val dateFormat = SimpleDateFormat("yyyyMMdd", Locale.getDefault()) val currentDate = dateFormat.format(Date()) val lastPlayDate = prefs.getString("last_play_date", "") val dailyPlayCount = prefs.getInt("daily_play_count", 0) when { currentDate != lastPlayDate -> { // 新的一天,重置计数 prefs.edit() .putString("last_play_date", currentDate) .putInt("daily_play_count", 1) .apply() startGame() // 执行进入游戏的逻辑 } dailyPlayCount >= 3 -> { // 达到游玩上限 Toast.makeText(this, "您已达到游玩上限,无法继续游玩", Toast.LENGTH_LONG).show() } else -> { // 次数加1,保存后进入游戏 prefs.edit() .putInt("daily_play_count", dailyPlayCount + 1) .apply() startGame() } } } // 示例:进入游戏的逻辑方法 private fun startGame() { startActivity(Intent(this, GameActivity::class.java)) }
额外提醒:
- 要是怕用户改系统日期绕过限制,可以结合服务器时间验证:请求服务器拿到当前日期,用服务器日期替代本地日期做判断。
- 如果游戏支持多账号,记得把用户ID加入SharedPreferences的键名里(比如
"daily_play_count_${userId}"),避免不同用户的计数混在一起。
内容的提问来源于stack exchange,提问作者Ali Sidhu
相关产品推荐
相关产品推荐

