假设我有一个要在一定时间后执行的动作,而用户没有触摸屏幕。如何实现一个计时器,该计时器在动作超时时会执行操作,但是每次用户触摸屏幕时都会重新开始?
我搜索了几个答案,找不到像我想要的解决这个问题的方法那样简单的方法。这对我有用:
我使用了onUserInteraction()功能,该功能在用户每次触摸屏幕时都会调用。我声明了一个CountDownTimer,它从onCreate()开始,并在onDestroy()中取消。每次调用onUserInteraction()时,CountDownTimer都会被取消,重置并重新启动。 CountDownTimer完成后,将执行操作。
package com.example.inactivityapp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.CountDownTimer
import android.util.Log
import android.widget.Toast
private val TAG = InactivityActivity::class.java.simpleName
private const val INACTIVITY_SECONDS: Int = 5
class InactivityActivity : AppCompatActivity() {
var inactivitySeconds = INACTIVITY_SECONDS
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_inactivity)
inactivityCountDownTimer.start()
}
override fun onDestroy() {
super.onDestroy()
inactivityCountDownTimer.cancel()
}
override fun onUserInteraction() {
super.onUserInteraction()
Log.i(TAG, "user interaction")
inactivityCountDownTimer.cancel()
inactivitySeconds = INACTIVITY_SECONDS
inactivityCountDownTimer.start()
}
var inactivityCountDownTimer =
object : CountDownTimer(inactivitySeconds * 1000.toLong(), 1000) {
override fun onTick(millisUntilFinished: Long) {
Log.i(TAG, inactivitySeconds.toString())
inactivitySeconds--
}
override fun onFinish() {
Toast.makeText(
this@InactivityActivity,
"Activity Timeout: Perform timeout task",
Toast.LENGTH_LONG
).show()
Log.i(TAG, "activity timeout")
}
}
}