Отменить отсчет времени, если пользователь уходит от активности (Kotlin) - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть действие, которое отсчитывает 60 секунд, однако, если пользователь отходит от действия, используя кнопку «Назад» на экране или нажимая кнопку «Назад» на Android, мне нужен таймер обратного отсчета для отмены или простопродолжается в фоновом режиме.Вот код, который я должен запустить таймер:

import android.os.CountDownTimer

class GamePlay : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
// play music, though it's cutting out after 15 seconds for some reason
        var musicPlayer: MediaPlayer? = MediaPlayer.create(this, R.raw.backgroundmusic)
        musicPlayer?.start()
// start the timer
        object : CountDownTimer(60000, 1000) {
            override fun onFinish() {
                val intent = Intent(applicationContext,Results::class.java)
                startActivity(intent)
            }
            override fun onTick(p0: Long) {
                time.text = ""+p0/1000
            }
        }.start()
    }
}
// function for clicking the back button on screen
fun goToMainMenu(view:View){
    val intent = Intent(applicationContext,MainMenu::class.java)
    startActivity(intent)
}

Я бы подумал, что это будет в духе CountDownTime.cancel(), но я не могу понять, как это сделать, и я незнаю, как я могу заставить это сделать это, если пользователь также использует кнопку возврата системы.

Любые указатели оценены.

Ответы [ 3 ]

2 голосов
/ 27 сентября 2019

Прежде всего сохраните ваш таймер в поле:

class GamePlay : AppCompatActivity() {

    val timer = CountDownTimer(60000, 1000) {
        override fun onFinish() {
            val intent = Intent(applicationContext,Results::class.java)
            startActivity(intent)
        }

        override fun onTick(p0: Long) {
            time.text = ""+p0/1000
        }
    }

   ....
}

Затем в onCreate () запустите его и в onDestroy () остановите


override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   ... 
   // A bunch of other stuff

   timer.start()
}

override fun onDestroy() {
   super.onDestroy()
   timer.cancel()
}
2 голосов
/ 27 сентября 2019

Вам нужно сохранить ссылку на свой таймер, а затем вызвать cancel() в onDestroy вашей деятельности.

class GamePlay : AppCompatActivity() {

    private lateinit var timer: CountDownTimer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // play music, though it's cutting out after 15 seconds for some reason
        var musicPlayer: MediaPlayer? = MediaPlayer.create(this, R.raw.backgroundmusic)
        musicPlayer?.start()          

        timer = CountDownTimer(60000, 1000) {
            override fun onFinish() {
                val intent = Intent(applicationContext,Results::class.java)
                startActivity(intent)
            }

            override fun onTick(p0: Long) {
                time.text = ""+p0/1000
            }
        }.start()
    }

    override fun onDestroy() {
        super.onDestroy()
        timer.cancel()
    }
}
2 голосов
/ 27 сентября 2019

просто установите CountDownTimer как val и вызовите val.cancel ()

создайте свойство

private lateinit var timer: CountDownTimer

установите значение val как CountDownTimer

timer = object : CountDownTimer(60000, 1000) {
            override fun onFinish() {
                val intent = Intent(applicationContext,Results::class.java)
                startActivity(intent)
            }
            override fun onTick(p0: Long) {
                time.text = ""+p0/1000
            }
        }.start()

setфункция timer.cancel () для функции обратного нажатия

override fun onBackPressed() {
    super.onBackPressed()
    timer.cancel()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...