-
프래그먼트와 백스택, 그리고 엑티비티Android 2020. 5. 20. 01:01
안드로이드는 스택과 같다.
실행하면 화면들이 스택과 같이 점차 점차 쌓이는 것이다.
그러니깐 자료구조의 스택처럼 엑티비티가 차례대로 아래에서부터 쌓인다는 것인데 이러한 형태를 백스택이라고도 한다.
그리고 이런 백스택에 쌓이는 엑티비티들은 유저와 상호작용하는 엑티비티들을 모아놓는 태스크에 속한다
정말 일부의 어플리케이션을 제외하면 엑티비티를 하나만 사용할리는 없다. 하나의 어플리케이션에는 다양한 엑티비티와 프래그먼트들이 공존한다.
실제 사용자와 화면에서 상호작용하는 엑티비티나 프래그먼트는 하나일 수 밖에 없다. 위에서 말한 상호작용과 다른 것은 스택의 가장 위에 있는 엑티비티나 프래그먼트만이 사용자의 입력과 이벤트를 입력받을 수 있다.
그래서 어플리케이션 사용 중에는 엑티비티를 실행했다가도 뒤로가기 버튼을 통해 이전 엑티비티나 프래그먼트로 돌아가기도 한다.
엑티비티의 스택 관리
기존에 내가 알고 있는 엑티비티의 화면 전환은 인텐트를 통해 이루어지는 것이었다.
인텐트를 통해 엑티비티를 실행하면 새로운 엑티비티가 스택 위에 쌓인다.
만약 기존에 실행중이던 엑티비티를 제거하고 새로 쌓고 싶다면 finish 메소드나 인텐트 플래그를 통해 제어할 수 있다.
그게 아니라면 새로운 엑티비티에서 뒤로가기를 실행했을 때, 새로운 엑티비티는 제거되고 이전 엑티비티가 다시 위로 떠오른다.
만약 엑티비티가 제거되지 않고 밑에 쌓여있는 상태라면 엑티비티는 생명주기 중 onStop 상태에 들어가게 된다.
프래그먼트의 스택 관리
그래서 이 포스팅의 본론인 프래그먼트의 스택 관리에 대해서 알아보자.
일단 오늘 포스팅을 쓰게 된 계기는 현재 프로젝트 진행 중인 팀플레이 어플리케이션의 로그인, 회원가입 화면 제작 중 생긴 문제 때문이었다.
*잠시 홍보하자면 팀플레이는 대학생 연합 앱 제작 동아리인 YAPP에서 제작중인 서비스 중 하나이다. 스포츠 동호회들을 쉽게 관리하고 그들간 교류와 경기를 쉽게 이어주려는 목적을 가지고 있다.
로그인 기능 중 이메일을 입력하는 화면이다. 팀플레이는 화면 하나 당 이메일, 비밀번호, 닉네임을 따로따로 입력하도록 유도해서 사용성을 높였다. 현재 시중의 토스나 뱅크 샐러드도 비슷한 로직을 갖추고 있는 것으로 알고있다.
다음 화면인 비밀번호 입력화면이다. 팀플레이의 로그인, 회원가입 화면은 엑티비티에서 부분적으로 프래그먼트를 바꾸는 형식의 구조를 갖추고 있다.
왜냐하면 배경과 로고는 그대로인데 데이터를 입력하는 부분은 많이 바뀌기 때문에 프래그먼트만을 바꾸는 것이 효과적이기 때문이다.
문제는 여기서 발생했다.
프래그먼트만이 바뀌었는데 여기서 뒤로가기를 하면 어떻게 될까?
기존 코드는 다음과 같았다.
프래그먼트 매니저를 사용해서 프래그먼트를 replace해주는 형태를 갖추고 있다.
이렇게되면 기존 프래그먼트는 제거되고 새로운 프래그먼트로 교체된다. 즉 엑티비티 위에 하나의 프래그먼트만 올라가있는 상태이다.
이 상태에서 뒤로가기 버튼을 누르면 어떻게 될까?
그대로 엑티비티가 종료된다.
이것은 의도하던 상황이 아니었고, 분명히 유저는 사용중에 뒤로가기를 누를 수 있는 여지가 있다.
뒤로갔을 때 입력하던 프래그먼트가 그대로 나타나는 것이 최선일 것이다.
그래서 해결방안을 찾던 중 너무나 쉬운 방법을 찾았다.
프래그먼트 트랜잭션을 커밋하기 전에 addToBackStack이라는 메소드를 사용하는 것이다.
이 메소드를 사용하면 앞서 말한 엑티비티의 백스택처럼 프래그먼트도 쌓을 수 있는 것이다!!!(처음 이 사실을 알게 되서 매우 신기했다)
수정한 코드는 다음과 같다.
이 코드를 사용함으로써 뒤로가기를 눌렀을 때 이전 프래그먼트로 정상적으로 이동할 수 있었다.
'Android' 카테고리의 다른 글
Gson을 통해 API Response를 Enum으로 매핑하기 (0) 2020.09.25 [안드로이드 9.0 프로토콜 접속 변경사항] CLEARTEXT communication to XXXX not permitted by network security policy (0) 2020.07.24 SharedPreference 이야기 (0) 2020.06.19 EditText 자동 포커스 기능 막기 (0) 2020.05.25 MVP 패턴 기초 - Google Architecture을 활용한 설계 (0) 2020.02.23