뒤로가기 버튼으로 종료를 원할 시 재차 확인을 하면 좋다.
private var doubleBackToExitPressedOnce = false
fun AppCompatActivity.backButton() {
if (doubleBackToExitPressedOnce) {
finish()
return
}
doubleBackToExitPressedOnce = true
Toast.makeText(this, "한번 더 누르시면 종료됩니다.", Toast.LENGTH_SHORT).show()
Handler().postDelayed({ doubleBackToExitPressedOnce = false }, 2000)
}
RX
const val toastDurationInMilliSeconds = 2000
private val source: Subject<Long> = BehaviorSubject
.createDefault(0L)
.toSerialized()
fun AppCompatActivity.backButton() {
source.onNext(System.currentTimeMillis())
}
fun AppCompatActivity.backButtonDisposable(activity: Activity): Disposable {
return source.toFlowable(BackpressureStrategy.BUFFER)
.observeOn(AndroidSchedulers.mainThread())
.buffer(2, 1)
.map {
result -> Pair<Long, Long>(result[0], result[1])
}
.subscribe { t ->
if(t.second - t.first < toastDurationInMilliSeconds) {
activity.finish()
} else {
Toast.makeText(activity, "한번 더 누르시면 종료됩니다.", Toast.LENGTH_SHORT).show()
}
}
}
activity
override fun onStart() {
super.onStart()
disposable = backButtonDisposable(this)
}
override fun onStop() {
super.onStop()
disposable = null
}
override fun onBackPressed() {
backButton()
}
++
object ConfirmToExit {
private const val DELAY_MILLIS = 2000L
private var previousClickTimeMillis: Long = 0L
fun AppCompatActivity.confirmToExit() {
val currentTimeMillis = System.currentTimeMillis()
if (previousClickTimeMillis != 0L) {
if (currentTimeMillis <= previousClickTimeMillis + DELAY_MILLIS) {
finish()
previousClickTimeMillis = 0L
return
}
}
previousClickTimeMillis = currentTimeMillis
Toast.makeText(this@confirmToExit, "한번 더 누르시면 종료됩니다", Toast.LENGTH_SHORT).show()
}
}