본문 바로가기

안드로이드/androidstudio

[Android] 뒤로가기로 어플 종료

 오늘 포스팅 할것은 공부하면서 프로젝트를 실행하는데 back키로 특정 행동을 만들경우 app 종료가 이루어지지 않아 연속으로 back키를 누를시 app이 종료되도록 하는 방법을 포스팅하겠습니다.

먼저 종료 조건을 정의하게된 원인이 된 key에 조건을 넣은 코드입니다.

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
        settingNumber()
        return keyCode != KeyEvent.KEYCODE_BACK
    }

 아래 코드는 키 입력시 특정 함수가 동작하도록 할 목적으로 onKeyUp을 override 하여 사용하였습니다.

 그리고 back키로 종료가 안되어 return으로 fals를 넣었지만 동작하지 않았습니다.

 이 해결법으로 어플 종료 식을 찾아본 결과 2가지 해결법을 찾았습니다.

 1. onKeyUp 함수 내에서 if문으로 처리

     이 방법은 onKeyUp 함수는 키가 눌렸을때인데 back 키에대해 조건문을 만들어 back키에 대해 finish를 넣어 종료시키도록 하는것 입니다. 다만 여기서 키보드를 지우는 목적으로 1회 혹은 실수로 누르는 경우를 대비하여 2회로 조정할 필요성이 생길수도 있습니다.   

   *onKeyUp, onKeyDown 의 boolen return값에 따른 차이는 true일 경우 제가 정의한 기능만실행하고 기본 설정은 무시하는 것이며 false를 반환할경우 제가 정의한 기능과 기본 설정을 실행하는 것입니다.

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    if(KeyEvent.KEYCODE_BACK == keyCode){
        finish()
        return false
    }else{
        settingNumber()
        return true
    }
}

 2.onBackPressed 함수로 정의하여 처리

   두번째 방법은 onBackPressed함수를 호출하여 재정의를 통해 활성화 시키는 방법입니다. 위 방법이 모든 키를 다루는 곳이다 보니 back에 대해서만 다룰때 사용하기 좋으며 앞서 언급한 실수로 입력을 대비하여 2회 입력에 대한 조건을 만들어 실수로 종료되는것을 방지할수있습니다.

private var backpressTime = 0L
    override fun onBackPressed() {
        if(System.currentTimeMillis() > backpressTime + 2000){
            backpressTime = System.currentTimeMillis()
            Toast.makeText(this@MainActivity,"종료시도",Toast.LENGTH_SHORT)
        } else if(System.currentTimeMillis() <= backpressTime + 2000){
            Toast.makeText(this@MainActivity,"종료시도",Toast.LENGTH_SHORT)
            finish()
        }
    }

   먼저 두번 터치로 종료되는 조건이며 두번 터치의 시간차이를 확인하여 빠르게 2회 터치시 종료하게 되는 방식입니다.

위 방식 사용시 시간값을 저장할 변수 1개가 더 필요해지며 최초 터치와 2회차 터치가 2초 이내일 경우 종료되는 방식입니다.