[Android] 액티비티 스택에 관하여

안드로이드는 종이접기와 같다. 안드로이드 매테리얼 디자인이 도입되며 사용자들에게 종이의 질감과 움직임을 주도록 가이드라인이 만들어졌다. 이로 인해 스마트폰 화면 속에 어플리케이션들이 실제 종이로 움직이듯이 행동하게 되었고, 이는 사용자의 경험이 높아지는 효과를 얻게 되었다.

그래서 나는 안드로이드의 새로운 화면을 노출시킬때, 화면을 쌓는다고 표현한다. 종이 위에 종이를 포개듯이 새로운 화면을 쌓는다. 하지만 안드로이드에서 화면을 관리하는 것은 생각 이상의 일이다.

태스크와 백스택

사용자의 인터페이스를 구성하는 기본 단위를 액티비티라 한다. 매테리얼 디자인에 빚대어 비유하면, 한 장의 도화지라 생각하면 용이하다. 한 장의 도화지 위에 글자들을 쓸 수도 있으며, 버튼들을 올릴수도 있다. 또한 액티비티들이 모여 하나의 어플리케이션으로 구성된다.

중요한 점은 하나의 어플리케이션에서 다른 어플리케이션의 액티비티를 사용할 수 있다는 것이다. 하나의 어플리케이션 내에서 다른 어플리케이션이 미리 만들어 놓은 종이(액티비티)를 빌려 쓸 수 있는 것이다. 예를 들어 내 어플리케이션에서 사진을 찍고 싶을 때 카메라 액티비티를 빌려 쓰는 것이 이에 해당한다.

여기서 태스크의 개념이 나오게 된다. 태스크란 특정 작업을 수행할 때 사용자와 상호작용하는 액티비티들의 모음이다. 그래서 하나의 태스크 안에 여러개의 어플리케이션 액티비티들이 쌓일 수 있다.

출처 : https://developer.android.com/guide/components/tasks-and-back-stack.html

그리고 백스택은 액티비티가 열린 순서대로 스택에 정렬된다. 매테리얼 디자인에 비유하면, 새로 보여지는 종이(액티비티)에 맞춰 밑에 깔린 종이들(액티비티들)이라 이해하면 좋다.

매니페스트 런치 모드

그런데 액티비티들은 열리는 방식을 설정할 수 있다. 이것이 바로 매니페스트 런치 모드이다. 런치 모드에는 실제 4개가 존재하지만, 3개가 많이 쓰인다.

출처 : https://developer.android.com/guide/components/tasks-and-back-stack.html

standard는 기본 설정이다. 액티비티는 여러 번 인스턴트화(생성)될 수 있고, 각 인스턴스는 서로 다른 태스크에 속할 수 있으며 한 작업에 여러 개의 인스턴스가 있을 수 있다.

singletop은 standard와 동일하나, 사용하고 있는 태스크 최상단에 이미 singletop이 적용된 액티비티가 있다면 이를 onNewIntent()를 사용하여 재사용한다. 매테리얼 디자인에 비유하면, 쓰고 있던 종이 뭉치(사용하고 있는 태스크) 맨 위에 사용하려는 종이가 있다면 다시 사용하고 없다면 새로운 종이를 사용한다고 이해하면 좋다.

singletask은 새 태스크의 루트에 액티비티를 생성한다. 만약 액티비티가 이미 존재하는 경우에는 이를 onNewIntent()를 사용하여 재사용한다. 매테리얼 디자인에 비유하면, 쌓여있는 종이 뭉치들(전체 태스크) 사이에 사용하려는 종이가 있다면 꺼내서 다시 사용하고 없다면 새로운 종이를 사용한다고 이해하면 좋다.

인탠트 플래그

그리고 각각의 종이(액티비티)마다 별개의 표시를 통해서 이전의 액티비티, 사용하고 있는 액티비티, 사용하게 될 액티비티에 대한 처리를 할 수 있다.

FLAG_ACTIVITY_SINGLE_TOP를 우선 설명해본다. A와 B 액티비티가 기존에 존재하고 새로운 B 액티비티를 실행시키려 한다. 플래그가 없이 실행을 시킨다면 B 액티비티 위에 다시 B 액티비티가 실행될 것이다. 하지만 FLAG_ACTIVITY_SINGLE_TOP 을 사용하게 된다면 기존에 실행시킨 B 액티비티를 재사용하게 될 것이다. 위에 설명드렸던 매니페스트 런치모드의 singleTop과 동일한 방식이다.

FLAG_ACTIVITY_NO_HISTORY는 다음과 같다. A와 B 액티비티를 기존에 실행시켰다고 가정해보자. 이전에 B 액티비티를 플래그 없이 실행을 시켰다면 새롭게 A 액티비티를 실행시키고 백버튼을 입력했을 경우, B 액티비티가 화면에 나오게 될 것이다. 하지만 FLAG_ACTIVITY_NO_HISTORY를 사용하게 되면, 새롭게 A 액티비티가 실행되었을 때 B 액티비티는 백스택에서 사라지게 된다. 최종적으로 백버튼을 입력하게 되면 화면에는 A 액티비티가 노출될 것이다.

태스크와 백스택 등에 대해 이해하기 어려운 면이 분명이 있다. 하지만 한번 이해를 하게 되면 이후 안드로이드 개발에 분명 도움이 될 것이다.

참조 :

  1. https://developer.android.com/guide/components/tasks-and-back-stack.html
  2. http://www.slideshare.net/luvgaram/activity-launch-mode
  3. http://m.blog.naver.com/mad_ai/130119521229