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 解决方案是更好的选择,如果您的游戏是单人游戏,您可以在本地使用服务和离线计算。
您选择哪种方法是您的自由选择。
我正在开发一款游戏,每 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 解决方案是更好的选择,如果您的游戏是单人游戏,您可以在本地使用服务和离线计算。
您选择哪种方法是您的自由选择。