1. Activity Stack And Back / Flag
http://developer.android.com/guide/components/tasks-and-back-stack.html
2. Activity Stack에 쌓이기
Activity를 start하는 것은 기본 동작은 Activity를 하나의 Stack에 쌓는 동작
이며, 최 상단에 있는 Activity가 화면에 노출되는 것이라고 생각할 수 있습
니다.
여기서 쌓이는 stack을 보통 UI Stack이라고 합니다. 예를 들어서 A에서
startActivity를 3회 호출하게 되면, 3개의 Activity가 Activity Stack에 쌓이
고 마지막 A만 화면에 보이는 것입니다. 일반적으로 A가 하나만 있는 것이
라 생각이 되겠지만, 아래 그림과 같은 모습이 되는 것이죠.
A
A
A
Activity Stack
startActivity(Context, A.class);
Hist #2
Hist #3
Hist #1
startActivity(Context, A.class);
3. Activity Stack 현황 확인하기
Activity Stack에 실제로 쌓인 모습을 보고 싶은 생각이 듭니다. 왠지 매번
그렇다라고 이야기만 들었기 때문에, 눈으로 보는 것이 가장 좋겠지요.
이를 위해서 console에 아래와 같은 명령어를 실행합니다.
adb shell dumpsys activity
위 명령어를 통해서 나오는 내용 중에서, Activity Stack이라는 항목 중에
서 Task Record 중에서 우리가 만든 package name이 명시되어 있는
Task를 찾아보면, 해당 Activity Stack에 쌓인 Activity들이 Hist #n 형태로
표시가 됩니다. 숫자가 높을 수록 상단에 위치합니다.
실제 결과로 확인하기로 합니다.
4.
5. navigate back
안드로이드는 Hardware에서 Back 기능을 수행할 수 있습니다.
이러한 경우에 Activity Stack에서는 최상단의 Activity (현재 Activity)가 Destroy되고, Stack에
서 바로 아래에 있던 Activity가 Resume되면서 화면 상에 표시하게 됩니다.
참고. Back Navigation 제어하기
6. Flag 통한 Activity Stack 조정
Activity 자체에 해당 Activity가 뜨는 방법을 아래와 같이 Flag를 설정해서 제어가 가능합니다.
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
여기서 자주 사용되는 Flag에 대해서 간단히 알아보도록 합니다.
7. lauchMode 값과 Flag
앞서 살펴본 바와 같이 Activity start 시키는 intent에 Flag를 지정해서 호출할 수도 있지만, 필요에 따
라서는 manifest 파일에 정의된 activity의 launchMode 값에 값을 지정해서 Activity가 stack 상에 노출
되는 방법도 제어가 가능합니다. 빨간색은 비권장. (정확한 이해 없을 경우 UX가 꼬입니다.)
• standard
o activity의 multi-instance 허용하며, lauch 될 때 마다 instance 생성되어, stack 최상단에
위치함. 기본 설정.
• singleTop
o activity의 multi-instance는 허용하지만, 동일 Activity가 target task의 top에 존재하면, 생
성을 새로이 하지 않고, onNewIntent 호출을 합니다.
o 생명 주기 상으로는 onPause > onNewIntent > onResume 순으로 호출
• singleTask
o device 당 1개의 activity instance를 허용하며, task의 root가 되어 다른 activity가 자신의
위에 쌓이는 것을 허락한다.
• singleInstance
o device 당 1개의 activity instance를 허용하며, task의 root가 되며, 다른 activity와 task를
공유하지 않습니다. (FLAG_ACTIVITY_NEW_TASK와 유사)
8. Task 분리가 가능? 언제?
앞서 살펴 본 바에 따르면, Task라는 형태로 흐름을 별도로 분리가 가능함을 알 수 있습니다.
그런데, 왜 그러한 경우가 필요할까요?
이러한 경우에 대한 예제로 쉽게 생각이 가능한 경우가 메신저 App들을 생각할 수 있습니다.
메신저 App을 통해서 여러 개 대화방을 만드는 경우에.
Dashboard 역할 하는 것 자체가 하나의 Task이며, 대화방이 하나씩 생성이 될 때에 이들은 각각이
하나의 Task가 되는 형태로 구현이 가능합니다.
각 대화방은 메신저 App의 한 부분이면서도, 독립적인 작업이며 이렇게 동작하게 하도록 하기 위해
서 우리는 별도 Task를 분리할 수 있게 됩니다.
9. Task
Task == Activity Stack
Task는 메모리상에 여러 개가 동시에 존재 가능하며, 서로 독립적입니다.
Task 안에 있는 Activity는 다름 App에 있는 Activity도 포함이 될 수도 있습니다.
안드로이드는 Application 위에 있는 Task들이 병행 존재하는 형태라고 이해할 수 있습니다.
Task를 분리할 수 있기 때문에, 동일 인스턴스지만,
소속된 Task가 다를 수 있고, 각기 다른 상태를 유지할 수 있는 경우들이 있습니다.
예 )잠시 지도로 위치를
보게 startActivity로 호출