본문 바로가기
Android/Android Core

[Android/Kotlin] 뒤로가기 기능을 구현하는 방법: OnBackPressedDispatcher 활용법

by quessr 2024. 12. 3.

 

안드로이드 개발을 하다 보면, 뒤로가기 버튼을 눌렀을 때 특정 동작을 처리해야 하는 경우가 자주 발생합니다.

기존에는 onBackPressed 메서드를 오버라이드하여 이를 구현했지만, 안드로이드 12(API 31)부터 이 메서드가 Deprecated되었습니다. 대신 OnBackPressedDispatcher를 이용한 새로운 방식이 도입되었습니다.

이번 글에서는 안드로이드에서 뒤로가기 기능을 구현하는 새로운 방법과 그 이유를 정리 해 두겠습니다.

 

왜 onBackPressed가 Deprecated되었을까?

onBackPressed는 뒤로가기 버튼의 동작만을 단순히 처리하도록 설계된 메서드였습니다. 하지만 Fragment와 Lifecycle 기반 컴포넌트가 점차 중요해지면서 뒤로가기 이벤트를 더 유연하게 처리할 필요성이 커졌습니다.

안드로이드에서 OnBackPressedDispatcher를 도입한 이유:

  1. Fragment와의 통합: Fragment 내부에서도 독립적으로 뒤로가기 동작을 처리할 수 있도록 설계.
  2. 다중 콜백 지원: 여러 컴포넌트에서 독립적으로 뒤로가기 동작을 정의할 수 있음.
  3. Lifecycle 기반 동작 제어: Activity와 Fragment의 생명주기에 따라 동작이 자동 관리.

새로운 뒤로가기 처리 방식: OnBackPressedDispatcher

새로운 방식에서는 OnBackPressedCallback 객체를 생성하고 이를 OnBackPressedDispatcher에 등록하여 뒤로가기 버튼의 동작을 제어합니다. 이를 통해 보다 명확하고 관리 가능한 코드를 작성할 수 있습니다.

 

예제: 모니터링 상태에서 뒤로가기 이벤트 처리

다음은 모니터링 상태일 때 종료 다이얼로그를 표시하고, 그렇지 않을 경우 기본 뒤로가기 동작을 수행하는 코드입니다.

구현 코드

class MonitoringActivity : AppCompatActivity() {
    private var isMonitoring: Boolean = false // 모니터링 상태 플래그

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_monitoring)

        // 뒤로가기 버튼 처리 설정
        handleBackPressed()
    }

    /**
     * 뒤로가기 버튼 동작 설정
     */
    private fun handleBackPressed() {
        val callback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (isMonitoring) {
                    // 모니터링 중이라면 종료 다이얼로그 표시
                    finishMonitoringEvent()
                } else {
                    // 기본 뒤로가기 동작 수행
                    isEnabled = false // 콜백 비활성화
                    onBackPressedDispatcher.onBackPressed() // 시스템 기본 동작 호출
                }
            }
        }

        // OnBackPressedDispatcher에 콜백 등록
        onBackPressedDispatcher.addCallback(this, callback)
    }

    /**
     * 모니터링 종료 다이얼로그 표시
     */
    private fun finishMonitoringEvent() {
        AlertDialog.Builder(this)
            .setTitle("End Monitoring")
            .setMessage("Are you sure you want to stop monitoring?")
            .setCancelable(false)
            .setPositiveButton("Yes") { _, _ ->
                isMonitoring = false // 모니터링 상태 해제
                finish() // Activity 종료
            }
            .setNegativeButton("No") { dialog, _ ->
                dialog.dismiss()
            }
            .show()
    }
}

 

코드 설명

1. OnBackPressedCallback 생성

  • OnBackPressedCallback은 뒤로가기 버튼 동작을 정의하는 콜백 객체입니다.
  • handleOnBackPressed 메서드에서 뒤로가기 버튼 클릭 시 수행할 동작을 정의합니다.
  • isEnabled를 false로 설정하면 기본 동작이 수행됩니다.

2. 콜백 등록

  • onBackPressedDispatcher.addCallback(this, callback)를 호출하여 콜백을 등록합니다.
  • this는 LifecycleOwner로, Activity의 생명주기를 따릅니다.
  • Activity가 종료되면 콜백도 자동으로 비활성화됩니다.

3. 사용자 정의 동작

  • isMonitoring 플래그를 사용해 모니터링 상태를 확인합니다.
  • 모니터링 중이라면 종료 다이얼로그를 표시하고, 그렇지 않을 경우 기본 뒤로가기 동작을 수행합니다.

 


참고: https://developer.android.com/reference/androidx/activity/OnBackPressedDispatcher 

 

OnBackPressedDispatcher  |  Android Developers

androidx.appsearch.builtintypes.properties

developer.android.com

 

반응형