안드로이드 With Java #12 Stack

Jake Seo·2020년 8월 6일
0

안드로이드 With Java

목록 보기
12/31

안드로이드 With Java #12 Stack

Stack 개념

일반 자료구조 Stack과 같은 뜻임. 우리가 Intent를 이용하여 여러 개의 Activity를 호출하면 Activity는 Stack 자료구조형으로 쌓이게 됨.

Stack의 관리방법

Launch Mode

(권장) Activity를 복수개 생성할 수 있는 경우

Standard
  • 기본모드 (특별히 설정을 해주지 않으면 설정)
  • 다중 인스턴스 허용 (Activity가 2번 이상 생성될 수 있음)

Activity A가 2번 생성된 것을 볼 수 있다.

SingleT op
  • 조건부 다중인스턴스 허용
  • 해당 액티비티가 최상위 stack에 있는 경우에는, onNewIntent()메소드를 호출한다.

Activity A가 최상위에 있는 상태로 또 Activity A를 만들었을 때의 결과이다. Standard에서는 Activity A가 하나 더 생기지만, Single Top에서는 onNewIntent() 메소드를 통해 최상위 Activity A가 지워지고 새로운 Activity A가 생긴다.

(비권장) Activity를 단수개 생성할 수 있는 경우

SingleTask
  • 비권장
  • 오직 한개만 생성될 수 있고, 자신이 새로운 stack을 만들어 나가고, 다른 액티비티들을 위에 쌓을 수 있다.

Activity B에서 Activity C를 호출했을 때, Activity C가 새로운 스택을 만들고 Activity C에서 Activity B를 호출했을 때 Activity C에 의해 새롭게 만들어진 스택에 쌓이게 된다.

SingleInstance
  • 비권장
  • 오직 한개만 생성될 수 있고, 자신이 새로운 stack을 만들어 나가고, 다른 액티비티들을 위에 쌓을 수 없다.

SingleTask와 같이 Activity C로 새로운 스택을 만든 뒤에 Activity B를 호출하면 기존 스택에 쌓인다.

비권장이 비권장인 이유

스택이 여러개로 나뉘어버리면 모든 스택을 관리하기가 매우 까다롭다. 구글의 공식문서에서도 이러한 패턴을 권장하지 않는다.

Intent Flag

종류가 10가지가 넘어서 매우 다양하지만 몇몇가지만 알아보자. 스택을 관리할 때 '이런 Intent Flag는 없을까?' 할 때 검색해서 찾아보면 됨.

FLAG_ACTIVITY_BROUGHT_TO_FRONT

  • 시스템에 의해 설정되는 값 (기본 값)
  • Activity가 singleTask이고 이미 Activity 스택에 존재하고 있는 상태라고 가정했을 때, 호출된 Activity가 다시 호출된다.

Activity C에서 Activity A를 호출하였을 때, Activity A가 재생성되지 않고 기존에 아래에 깔려있던 Activity A가 위로 올라옴. (단, singleTask이며 스택에 존재하는 상태여야 함)

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

  • 플래그가 사용된 액티비티부터 최상단의 액티비티까지 모두 삭제

Activity D에서 Activity B를 다시 호출했을 때 Activity B가 재생성되며 기존 Activity B 상단에 위치하던 모든 Activity를 삭제하며 나옴.

FLAG_ACTIVITY_CLEAR_TOP

  • 스택에 액티비티가 존재할 때 새롭게 생성하지 않고 앞으로 가져옴
  • 앞으로 가져올 때 최상단 액티비티부터 호출된 액티비티까지 모두 삭제

FLAG_ACTIVITY_NO_ANIMATION

  • 액티비티가 전환될 때 애니메이션 효과를 넣지 않는다.

FLAG_ACTIVITY_REORDER_TO_FRONT

  • 호출하려는 액티비티가 스택에 존재하는 경우 스택의 순서를 재정렬한다.

Stack 실습

Stack의 관리 방법을 정하는 방법

위와 같이 manifest.xml 파일에서 정할 수 있음. 아무것도 안정하면 위에서 배웠듯이 standard가 기본으로 들어감.

Stack 테스트 해보기 (Standard)

3개의 Activity를 만들고 이전에 배웠던 Intent를 통해 Stack을 쌓아보자.

총 3개의 Activity를 만들었는데

MainActivity, SecondActivity, ThirdActivity 이렇게 3가지 Activity가 있다.

여기서 MainActivity > SecondActivity > ThirdActivity > MainActivity 순으로 호출을 한다.

단, ThirdActivity > MainActivity에서는 무한 루프가 일어나지 않도록 Intent에 정보를 넘겨 ThirdActivityMainActivity를 호출한 경우에는 MainActivity에서 SecondActivity를 호출하지 않도록 Intent에 정보를 넘겨준다.

실행 결과

실행 결과를 이론상으로 추측해보면

스택에 MainActivity, SecondActivity, ThirdActivity, MainActivity 순으로 쌓여있을 것이라고 추측할 수 있다.

SecondActivity를 제외하고는 standard 방식으로 Stack이 관리되고 있어서 standard 방식으로 진행된다.

첫화면

MainActivity, SecondActivity, ThirdActivity, MainActivity

뒤로가기 1번

MainActivity, SecondActivity, ThirdActivity

뒤로가기 2번

MainActivity, SecondActivity

뒤로가기 3번

MainActivity

Stack 테스트 해보기 FLAG_ACTIVITY_CLEAR_TOP

소스 추가

ThirdActivity에서 MainActivity를 호출할 때 FLAG_ACTIVITY_CLEAR_TOP 플래그를 준다.

실행 결과

결과는 위의 standard 형식으로 관리할 때와 얼핏보기에 같아보이지만 뒤로가기를 한번 누르면?

앱이 꺼진다.

그 이유는

위 그림을 보고 이해하면 된다.

알아야할 점

액티비티의 Stack을 관리하는 것은 어려운 일이고 매우 중요한 일이기 때문에 Stack을 잘 관리해야 한다.

하지만 일반적으로 개발할 때는 Stack을 따로 관리하는 일은 많지 않지만, Stack을 관리하는 방법이 있다는 것은 확실히 알아야 한다.

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글