본문 바로가기
🖥 Programming/📱 Android (Kotlin)

[Android][Kotlin] 뒤로가기 OnBackPressedCallback 사용방법 (ex. 뒤로가기 2번클릭 앱 종료 등)

by MinChan-Youn 2025. 2. 27.

안녕하세요~ 챠니입니다! :)

오늘은 Android의 뒤로가기 기능은 커스텀하는 "OnBackPressedCallback"에 대해서 알아보도록 하겠습니다!

 

onBackPressedDispatcher란?

onBackPressedDispatcher는 AndroidX 라이브러리에서 제공하는 기능으로, Activity와 Fragment 모두에서 뒤로가기 버튼 이벤트를 보다 세밀하게 처리할 수 있도록 지원합니다. 기존의 onBackPressed() 메서드를 단순히 오버라이드하는 방식과 달리, onBackPressedDispatcher를 사용하면 여러 컴포넌트가 동시에 이벤트를 처리할 수 있어 복잡한 화면 전환이나 Fragment 간의 이벤트 처리에 유리합니다. 이 방식은 앱의 생명주기와 밀접하게 연동되어, 화면 전환이나 백스택 관리 측면에서 장점을 가져갈 수 있습니다.

 

 

자 그럼 긴말 필요없이, 코드로 보여드리겠습니다.

 

 

 

onBackPressedDispatcher  기본적인 사용방법

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
   
    ...

    //뒤로가기 Callback 등록
    onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
}

private val onBackPressedCallback = object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        //뒤로가기 Callback 호출시, 로직 처리
        
        ...
        
    }
}

 

기본구성은 다음과 같습니다.

 

예전에는 onBackPressed()를 override해서 사용하면 끝이였는데요, 이제는 Callback을 따로 등록해서 처리를 할 수 있습니다.

 

 

 

 

하지만 여기서 끝이 아니죠??

여러분들은 보통 이것을 찾으러 오셨을것이라 생각합니다.

 

 

 

바로.. 바로...

 

뒤로가기 두번클릭시 종료는 그래서 어떻게 구현을 하는가??

 

 

 

뒤로가기 두번 연속 클릭시 앱 종료 - onBackPressedDispatcher 사용해서

로직은 다음과 같습습니다~

System.currentTimeMillis를 이용해서 현재시간을 따로 변수에 담아두고, 뒤로가기 버튼이 다시 클릭 되었을때의 시간을 측정하여 특정시간(ex. 2초)안에 속한 값이면 앱을 종료하는 로직을 구성하면 되겠습니다.

 

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
   
    ...

    //뒤로가기 Callback 등록
    onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
}

var mBackWait:Long = 0
private val onBackPressedCallback = object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        //뒤로가기 두번 클릭시 앱 종료
        if (System.currentTimeMillis() - mBackWait >= 2000) {
            mBackWait = System.currentTimeMillis()
            Toast.makeText(applicationContext, "뒤로가기 버튼을 한번 더 누르면 종료됩니다.", Toast.LENGTH_SHORT).show()
        } else {
            finishAffinity()
        }
    }
}

 

 

 

 

 

너무 쉽죠?

 

끝!

 

 

 

 

질문 또는 궁굼한 부분은 댓글을 남겨주세요! 친절하게 답변드리겠습니다!

응원의 댓글은 저에게 큰 힘이 된답니다! :)

즐거운 하루되세요!

 

깃허브 보러 놀러오세요 👇 (맞팔환영)

https://github.com/younminchan

 

younminchan - Overview

•🇰🇷/👨🏻‍💻/🖥/⚽️/🎤/🥁/🏃‍♂️/🚴‍♂️/🏄🏻‍♂️/🤟 •TechBlog⬇️ •안드로이드 4년차 개발자 https://minchanyoun.tistory.com - younminchan

github.com