-
onBackPressed와 finish의 차이Android 2020. 12. 4. 11:28
시작하기 전
최근 프로젝트를 진행하면서 한가지 궁금한 사항이 생겼습니다. 뒤로가기 아이콘을 눌러서 콜백이 호출됐을 때 엑티비티를 종료하고 뒤로가기 이벤트를 실행시키고 싶었습니다.
엑티비티를 종료하는 방법은 대표적으로 두가지가 있습니다. onBackPressed()와 finish().
저는 습관처럼 onBackPressed를 사용하려고 하다가 갑자기 finish와는 어떤 차이가 있고 어떤걸 쓰는게 좋은지 궁금해졌습니다. 그래서 짧지만 한번 정리해보려고 합니다.
Back버튼 이벤트를 처리할 수 있느냐 없느냐의 차이
Class SomeViewModel { _onBackClick: PublishSubject<Unit> = PublishSubject.create() _close: MutableLiveData<Unit> = SingleLiveEvent() close: LiveData<Unit> = _close init { _onBackClick .observeOn(AndroidSchedulers.MainThread()) .subscribe(_close::setValue) } fun onBackClick() = _onBackClick.onNext(Unit) }
위와 같이 뷰에서 onBackClick 이벤트를 호출시키면 뷰모델에서 _close의 값을 변화시키게 됩니다. 여기선 xml에서 뒤로가기 아이콘을 눌렀을 때 이벤트를 호출시킨다고 보면 되겠네요.
Class SomeActivity { private val viewModel: SomeViewModel by lazy { // 초기화 코드 } override fun onCreate() { viewModel.close.observe { // onBackPressed() // finish() } } }
viewModel에서 값이 바뀐 close를 observe하는 엑티비티는 이벤트를 발생시킵니다. 그런데 이 두개의 함수 중 어떤 것을 사용해야할까요? 현 상태에서는 결과는 동일할 것입니다.
같은 주제로 stackOverFlow에 찾아봤습니다.
https://stackoverflow.com/questions/50046201/the-difference-between-finish-and-onbackpressed
해당 글의 내용에 따르면 결국 이 차이입니다.
onBackPressed()는 Activity가 내부적으로 구현하는 함수입니다. 정확히 말하면 ComponentActivity의 OnBackPressedDispatcher가 구현하는 onBackPressed를 실행하는 것이죠. 이 onBackPressed를 override할 수 있습니다. 즉, 뒤로가기 버튼을 눌렀을 때 단순히 화면을 뒤로가는 기능 뿐만 아니라 프로그래머가 제어할 수 있는 것이죠.
하지만, finish()는 override할 수 없습니다. 즉, 현재 실행중인 엑티비티를 종료하는 것만을 목적으로 둔 함수입니다. 그래서 엑티비티를 종료하기 위한 목적이라면 finish()를 사용하는 것이 좋을 것 같습니다.
'Android' 카테고리의 다른 글
Android WorkManager 사용법 (0) 2021.05.04 Two-way Binding 사용법 (0) 2020.12.22 Fragment에서 ViewBinding 사용 시 발생할 수 있는 메모리릭 (0) 2020.11.13 변수의 동시성 제어에 관한 이슈 및 해결 (1) 2020.10.27 Gson을 통해 API Response를 Enum으로 매핑하기 (0) 2020.09.25