Android 上的游戏如何在后台运行?

How do games work in the background on Android?

我正在开发一款游戏,每 10 秒补充一定数量的动作,只有 250 步。您可能已经在许多现代手机游戏中将其视为能量单位。

倒计时10秒加步数的方法在“服务”中实现。但事实是,应用死掉后,服务很长一段时间不工作。或者它通过首先调用“OnStartCommand”重新启动,然后立即“onDestroy”并以某种方式工作。在这种重启的情况下,如果您打开一个应用程序,其中“服务”在“OnCreate”中启动,另一个“服务”将启动并与另一个“服务”并行工作(这打破了移动恢复的逻辑,因为您可以通过这种方式创建很多“服务”)......即使在这种情况下,“服务”也不会长寿和死亡。

class MyService : Service() {

lateinit var pref: SharedPreferences

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    Log.i("MYTAG", "Сервис работает")
    return START_STICKY
}

fun check() {
    if (pref.getInt("servicestep", 250) < 250) {
        reload()
    } else stopSelf()
}

private fun reload() {

    var progress = 0

    val b = "com.example.driverclicker"
    val intent = Intent(b)

    object : CountDownTimer(10100, 1000) {
        override fun onTick(millisUntilFinished: Long) {
            Log.i("MYTAG", Thread.currentThread().name)
            Log.i("MYTAG", "Таймер $millisUntilFinished")
            progress += 1
            intent.putExtra("step", progress)
            sendBroadcast(intent)
            if (progress == 10) {
                var step = pref.getInt("servicestep", 249)
                step += 1
                pref.edit().putInt("servicestep", step).commit()
                Log.i("MYTAG", "Таймер сохранился $step")
                Log.i("MYTAG", "Progress if= $progress")
            }
            Log.i("MYTAG", "Progress после if= $progress")

        }

        override fun onFinish() {
            intent.putExtra("step", 0)
            sendBroadcast(intent)

            check()

            Log.i("MYTAG", "Таймер закончился")
        }
    }.start()
}

override fun onCreate() {
    super.onCreate()
    pref = getSharedPreferences("save", Context.MODE_PRIVATE)
    check()
    Log.i("MYTAG", "Сервис запущен")
}

override fun onDestroy() {
    super.onDestroy()
    Log.i("MYTAG", "Сервис отключен")
}



override fun onBind(intent: Intent): IBinder {
    TODO("Return the communication channel to the service.")
}

} Activity

中的 BroadcastReceiver
 br = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val serviceSteps = intent?.getIntExtra("step", 0)
            if (serviceSteps != null) {
                showProgress(serviceSteps, R.id.moves_bar)

                if (serviceSteps == 10) {
                    val steps = presenter.loadMoveValue()
                    Log.i(TAGNAME, "Ресивер получил $steps")
                    presenter.showText("$steps", R.id.text_movesValue)
                    Log.i(TAGNAME, "Ресивер отобразил $steps")
                }
            }
        }
    }

    registerReceiver(br, IntentFilter(BROAD))

我有一个问题。例如,农场游戏如何在 Android 上运行?资源在那里后台生成,你来拿就行了。 Android?

如何在后台实现

有不同的方法来处理这个问题,最简单的是实现离线计算。获取时间戳,当服务停止工作时获取时间戳,当服务重新创建并再次工作时获取时间戳,通过这两个时间戳之间的时间,您可以计算出服务触发的频率。

正如您已经注意到的那样,这不是很安全并且很容易被操纵。

第二种方法是让服务器处理当前移动并与设备同步。这需要服务器、服务器逻辑和数据库,但这不容易操作。

对于多人游戏,serversynced 解决方案是更好的选择,如果您的游戏是单人游戏,您可以在本地使用服务和离线计算。

您选择哪种方法是您的自由选择。