본문 바로가기

Android/Activity

안드로이드/Android Flag Activity 사용법 및 주의사항 ~!

안드로이드/Android Flag Activity 사용법 및 주의사항 ~!




안드로이드 Flag Activity를 사용해서 Activity Stack에 작업을 진행 할 때 주의사항 입니다. 대표적으로 사용하는 Flag Activity에는 

1) FLAG_ACTIVITY_SINGLE_TOP

2) FLAG_ACTIVITY_CLEAR_TOP

3) FLAG_ACTIVITY_REORDER_TO_FRONT

4) FLAG_ACTIVITY_NO_HISTORY

가 있습니다.



Activity Stack 이란?

안드로이드 시스템은 Activity를 Activity Stack을 통해 관리 하게 됩니다. 기존 Stack의 개념과 동일 하다고 보시면 됩니다.





1) <FLAG_ACTIVITY_SINGLE_TOP>


먼저 "FLAG_ACTIVITY_SINGLE_TOP" Flag 사용시에 주의 사항 입니다.



가장 중요한 주의사항은 바로 동일한 Activity가 연속적으로 사용되어야만 Flag Activity가 적용 된다는 사실 입니다. 그림처럼 동일한 Activity가 연속적으로 사용되지 않는다면 [A]-> [B] -> [C] -> [D] 에 아무리 해당 Flag 속성인 "FLAG_ACTIVITY_SINGLE_TOP" 속성을 적용해도 적용 되지 않습니다. 그냥 차곡차곡 Activity Stack에 쌓이게 됩니다.


그러므로 [A] -> [B] -> [B] 의 형태로 동일한 Activity가 연속적으로 호출되어 Activity Stack에 쌓이게 되면 해당 속성을 이용 할 수 있습니다.


간단하게 속성에 대해 설명 하자면,



동일한 Activity Stack에 연속적으로 쌓이면 Activity를 재사용 하는 Flag 입니다.

재사용 Activity는 onPause(), onNewIntent(), onResume() 순서로 동작하게 됩니다.


기본원리

[A] -> [B] -> [C] -> [D] -> [D]  (적용 O)  결과 : [A] -> [B] -> [C] -> [D]

[A] -> [B] -> [A] -> [B] -> [A]  (적용 X)




2) <FLAG_ACTIVITY_CLEAR_TOP>



기존에 Activity Stack에 쌓여 있던 Activity에 동일한 Activity 쌓일 경우, RootActivity와 동일한 Activity만 남긴후 Stack에 쌓여 있는 나머지 Activity를 모두 onDestroy() 시켜 버리는 Flag 입니다. 결국 RootActivity와 동일한 Activity 하나가 남게 됩니다.

(RootActivity는 무조건 남게 됩니다.)


기본원리

[A] (RootActivity)

[A] -> [B] -> [C] -> [D] -> [B]  (적용 O)  결과 : [A] -> [B]

[A] -> [B] -> [A]  (적용 O)  결과 : [A]

[A] -> [B] -> [B]  (적용 O)  결과 : [A] - [B] 

[A] -> [B] -> [C]  (적용 X)  



"FLAG_ACTIVITY_CLEAR_TOP" 속성이 적용이 되면 

속성이 적용 된 동일한 Activity는 onCreate() 부터 시작

Activity Stack 내에 다른 Activity는 모두 onDestory() 시킴 (RootActivity 제외)


만약 "FLAG_ACTIVITY_CLEAR_TOP" 속성을 적용한 재사용 Activity가 onCreate()가 아닌 재사용을 시키고 싶을 경우에는 "FLAG_ACTIVITY_SINGLE_TOP" 속성과 같이 사용해 주시면 됩니다.




3) <FLAG_ACTIVITY_REORDER_TO_FRONT>



Activity Stack에 동일한 Activity가 쌓일 경우 "FLAG_ACTIVITY_REORDER_TO_FRONT" 속성을 가지고 있다면, 무조건 동일한 Activity를 최상위로 올립니다. 최상위로 올라간 Activity는 onResume() 으로 재시작 됩니다.

(FLAG_ACTIVITY_CLEAR_TOP Flag 무시함)


기본원리

[A] -> [B] -> [C] -> [A]  (적용 O)  결과 : [B] -> [C] -> [A]

[A] -> [B] -> [C] -> [D] -> [B]  (적용 O)  결과 : [A] -> [C] -> [D] -> [B]

[A] -> [B] -> [C] -> [C]  (적용 O)  결과 : [A] -> [B] -> [C]




4) <FLAG_ACTIVITY_NO_HISTORY>



Activity Stack에서 [B] Activity에 "FLAG_ACTIVITY_NO_HISTORY" 속성을 적용하고 [B] -> [C] Activity를 호출 하는 경우, [C] Activity는 스택에서 제거 된다. 하지만 종료 시점은 [D] Activity가 onDestory() 되는 시점에 [C] Activity도 같이 onDestory() 된다.


기본원리

1-1) [A] -> [B] -> [C] - [D]  (적용 O) ([B]에 속성 추가)  

1-2) [A] -> [B] -> [C] -> [D]  ([C]가 스택에서 제거됨) ([D]에서 백키누름)  

1-3) [A] -> [B]  (결과)


2-1) [A] -> [B] -> [C] -> [C] -> [C]  (적용 O)  (3번째 [C] 에서 속성 추가)

2-2) [A] -> [B] -> [C] -> [C] -> [C]  (4번째 [C] 가 스택에서 제거됨) (5번째 [C]에서 백키누름) 

2-3) [A] -> [B] -> [C]  (결과)




이렇게 해서 자주 사용하는 Flag Activity에 대해 알아 보았습니다. 다음번 포스팅에서는 좀 더 다양한 Flag Activity에 대해서 알아 보도록 하겠습니다. ~! ^^



감사합니다.