본문 바로가기
개발/안드로이드

ACTIVITY FLAG 속성

by darksilber 2012. 11. 22.
반응형

출처 - http://blog.naver.com/dolking1234?Redirect=Log&logNo=70139199786

 

안드로이드는 액티비티 관리를 스택의 형태로 한다.


기본적으로 먼저 호출된 액티비티는 나중 호출된 액티비티가 종료되지 않으면


종료가 될 수 없다. 따라서 이런 형태로만 액티비티를 관리해야 한다면 상당히 불편하고,


비효율적이 될수 밖에 없다. 안드로이드는 이러한 문제를 지원하기 위해 FLAG_ACTIVITY라는


속상값을 지원한다. 이 속성을 상황에 맞게 잘 활용한다면, 액티비티 관리가 좀더 효율적으로


이루어질 수 있다. 이 속성 중 몇가지를 살펴보자.



1. FLAG_ACTIVITY_SINGLE_TOP


이전 포스트에서도 나왔던 속성 값이다. 이 속성은 foreground 상태에 액티비티가 자기 자신을


호출할 경우, 새로운 액티비티를 생성하지 않고 자기 자신을 재활용 한다.


아래 그림을 보자.




액티비티A가 B를 호출하고 B가 다시 B를 호출하는 상태이다.


아무 속성값을 주지 않을 경우 두 그림중 윗 그림과 같은 상태로 액티비티 스택에 남을 것이다.


하지만 B가 다시 B를 호출할 때 SINGLE_TOP으로 속성값을 줄 경우


두 그림 중 아래와 같이 액티비티 스택이 중복되지 않는 채로 남게 된다.


속성 부여는 다음과 같이 하면 된다.



앞으로 나올 속성들도 동일한 방식으로 적용하면 된다.



2. FLAG_ACTIVITY_NO_HISTORY


NO_HISTORY는 해당 속성이 설정된 인텐트로 실행되는 액티비티는 액티비티스택에


자신의 흔적을 남기지 않는다. 역시 그림을 보자.



상황은 액티비티A가 액티비티B를 호출하고, 다시 액티비티B가 액티비티A를 호출한다.


마찬가지로 두 그림중 윗 그림이 무속성 상태이고 , 아래 그림이 NO_HISTORY속성을 준것이다.


액티비티 A가 액티비티 B를 호출할 때, 해당 속성을 지정한다. 이때 다른 액티비티 호출로


액티비티B가 backgroud 상태가 될때 , 액티비티B는 액티비티 스택에서 지워진다.



3. FLAG_ACTIVITY_REODER_TO_FRONT


REORDER_TO_FRONT는 액티비티의 순서를 바꿔주는 속성값이다.


호출하는 액티비티가 이미 액티비티 스택안에 존재할 경우 액티비티를 생성하는 대신


이미 존재하는 액티비티를 최상위로 끌어와 foreground상태로 만든다.




역시 윗 그림은 무속성이고, 아래 그림은 REORDER_TO_FRONT속성을 준것이다.


호출은 액티비티A에서 B를, 다시 B에서 A를 호출(속성값 설정)한다.


해당 속성을 줄 경우 그림에서도 확인할 수 있듯이 액티비티 스택에 background상태에 있던


액티비티를 끌어올려 foreground 상태로 재활용하는 것을 알수 있다.



4. FLAG_ACTIVITY_CLEAR_TOP


CLEAR_TOP속성은 액티비티 호출시에 호출되는 액티비티 위에 존재하는 모든 액티비티를


삭제하는 속성값이다.



액티비티는 A에서 B를 호출, 다시 B에서 A를 호출한다.


두번째 그림에서는 B에서 A를 호출할 때 CLEAR_TOP속성을 설정했다.


무속성이 액티비티 스택에 A-B-A에 순서로 쌓이는데 반해,


CLEAR_TOP속성은 B에서 A를 호출할때 A위에 모든 액티비티(예에서는 1개라고 가정)를


삭제하여 스택내에 A만이 존재하는것을 확인할 수 있다.



5. FLAG_ACTIVITY_NEW_TASK


위 속성을 보기전에 먼저 안드로이드 태스크에 관한 개념을 알아야 한다.


안드로이드에서 태스크란, 사용자가 특정한 목적을 이루기 위해 따르게 되는 액티비티들의


집합이다. 따라서 액티비티 스택은 1개 혹은 그 이상의 태스크로 구성된다.


예를 들면, 우리가 스마트 뱅킹을 하기 위해 몇개의 액티비티를 거쳐 계좌번호 입력 액티비티까지


실행시켰다고 치자. 그런데 계좌번호가 기억이 나지 않아 메모 어플에 저장해 둔 계좌번호를 확인하기


위해 Home키를 누르고, 메모 어플을 실행시켰다.


이때 액티비티 스택의 상태는 스마트 뱅킹을 위한 태스크와 계좌번호 확인을 위한 메모 태스크로


구분할 수 있다.(Home Launcher도 포함될 수 있다)


이제 NEW_TASK속성을 보자.


NEW_TASK 속성을 설정할 경우 동일한 Affinity(친화력)를 가진 태스크일 경우


해당 태스크에, 없을 경우 새로운 태스크를 생성하여 호출한다.


(그냥 나름 해석을 동물원에서 호랑이를 들여왔는데, 호랑이 우리가 있으면 호랑이 우리에 넣고


호랑이 우리가 없을 경우 새로운 우리를 만들어서 넣는다고 생각했음)



6. FLAG_ACTIVITY_MULTIPLE_TASK


해당 속성은 NEW_TASK속성과 관련이 있다. 이 속성이 NEW_TASK속성과 함께


사용될 경우, 호출하는 액티비티를 항상 새로운 태스크에 실행 시킨다.



남은 속성들은 다음에 정리 해야겠다. 힘들다.


틀린 내용 지적 환영합니다.

 

 

7. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET


이 속성은 태스크가 리셋 될 경우 해당 속성으로 실행된 액티비티부터 최상단 액티비티까지를


모두 삭제하는 속성 값이다. 그림으로 살펴보자.





액티비티 호출 순서는 액티비티 A가 B를 호출하고, B가 C를 호출할 때 CLEAR_TASK_RESET 속성을


적용하였다. 다시 C 가 D를 호출한 후 Home 키를 눌러 런쳐 화면으로 나가 태스크를 리셋시킨다.


태스크가 다시 실행된 후 foreground 액티비티를 확인해 보면 해당 속성으로 시작된 액티비티의


바로 이전 액티비티가 활성화 된것을 확인할 수 있다.


8. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED


이 속성은 인텐트를 이용해 새로운 태스크를 실행하거나 존재하는 태스크를


foreground로 가저올 경우 실행되던 태스크를 리셋 시킨다. 위에 설명한 Home 화면으로


나가 태스크가 리셋되는것은 해당 속성 때문에 발생한다.



9. FALG_ACTIVITY_FORWARD_RESULT


startActivityForResult()의 결과값을 해당 인텐트로 실행 된 액티비티가 아닌 그 다음 액티비티에서


전달 받는다. 역시 그림으로 이해하는 것이 빠를 듯 하다.



액티비티A가 액티비티B를 startActivityForResult()로 실행하고, 액티비티B가 액티비티C를


startActivity()로 시작하며, 시작 시 FORWARD_RESULT속성을 설정하면, 액티비티A의 결과값을


액티비티B가 아닌 액티비티C가 돌려주게 된다.



10. FLAG_ACTIVITY_NO_USER_ACTION


해당 속성은 액티비티가 사용자의 의도와 상관없이 자동 전환되는 경우(전화, 알람등)에


호출되는 onUserLeaveHint() 콜백 메서드가 호출되는 것을 방지한다.



11. FLAG_ACTIVITY_NO_ANIMATION


이 속성은 액티비티가 전환될 때 사용할 수 있는 애니메이션 효과를 제한한다.



12. FLAG_ACTIVITY_EXCLUDE_FROM_RECENT


해당 플래그 값을 설정할 경우 Home키를 길게 누르면 나타나는 최근 사용 목록에


나타나지 않는다.



이외에도 속성값이 더 존재하나, 시스템 단에서 자동으로 설정되는 것이므로 제외 하였다.

반응형

댓글