You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 用户点击"开始游戏"时,先读本地存储的最后游玩日期和当日游玩次数。
  2. 对比当前日期和记录的日期:
    • 日期不同:说明是新的一天,把次数重置为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:19:48