태스크란? (Task, Activity Stack)

어피니티란? (Android Affinity)
플래그란? (Android Flag)

출처:
 http://blog.naver.com/oklmg?Redirect=Log&logNo=7010500250
6




안드로이드 태스크란? (Android Task, Activity Stack)


-  Task는 어플리케이션에서 실행되는 액티비티를 보관하고 관리하며 Stack형태의 연속된 Activity로 이루어진다


- 선입후출(First In Last Out)형태로 나중에 적재된 액티비티일 수록 가장 먼저 사용된다

  만약 1페이지>2페이지>3페이지 순으로 액티비티를 이동했을때 실행순서대로 Task에 push해 놓았다가

  back버튼을 누르면 3페이지>2페이지>1페이지순으로 Task에서 pop시켜 되돌아 간다고 생각하면 된다


- 서로 다른 어플리케이션간의 이동에도 Task를 이용해 사용자 경험(UX)를 유지시켜 준다


- 최초적재 액티비티는 Root Activity 라고 하며 어플리케이션 런처로부터 시작된다


- 마지막으로 적재되는 액티비티는 Top Activity 라고 하며 현재 화면에 활성화 되어있는 액티비티를 말한다


- Task내에는 서로 다른 어플리케이션의 액티비티들이 포함될 수 있어 어플리케이션에 경계없이 

  하나의 어플리케이션인것 처럼 보이게 해준다


- Task의 Stack내에 존재하는 액티비티들은 모두 묶여서 background와 foreground로 함께 이동한다

  홈버튼 클릭(task interrupt => background 이동), 홈버튼 롱클릭(recent task => foreground 이동)


- Flag를 사용하여 Task내 액티비티의 흐름을 제어할 수 있다



어피니티란? (Android Affinity)


- 어플리케이션 내의 액티비티들은 하나의 어피니티를(affinity:친화력) 가지고 있다


- AndroidManifest 에서 <activity> 요소의 taskAffinity 속성을 사용해 개별 affinity가 지정 가능하다


- FLAG_ACTIVITY_NEW_TASK 플래그를 가진 인텐트 객체로 부터 호출된 allowTaskReparenting 속성을

  True로 가지고 있는 액티비티에 한해 affinity가 동작한다


- 위 조건이 만족한 상황에서 시작된 액티비티는 자신과 동일한 어피니티를 갖는 태스크가 있을경우

  해당 태스크로 이동한다


- 즉, [b]어피니티를 가진 A액티비티가 호출되어 해당 태스크에 속해있을때 [b]어피니티를 가진 태스크가

  호출되면 A액티비티는 [b]어피니티를 가진 태스크로 이동한다


- 어피니티에 의해 태스크가 이동된 후에 back버튼으로 반환시 원래 해당하던 태스크로 돌아간다


- 하나의 어플리케이션내에서 하나 이상의 기능을 갖는 어플리케이션이 존재할경우 각 액티비티별로 다른

  어피니티를 지정해 관리할 수 있다



플래그란? (Android Flag)


- AndroidManifest 에서 플래그를 사용할때에는 <activity> 요소의 launchMode 속성을 사용하며

  launchMode에서 사용가능한 속성은 다음과 같이 4가지만 가능하다


  standard: 

  스택중 어느곳에나 위치 가능하며 여러개의 인스턴스가 생성가능하다


  singleTop: 

  스택중 어느곳에나 위치 가능하며 여러개의 인스턴스가 생성가능하고 호출한 activity와 현재

  최상위 activity가(top activity) 동일한 경우 최상위 activity가 재사용 된다(기존 최상위 activity는 pop)


  singleTask: 

  루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능하다(타 task에서 동일 activity 사용불가)

  다른 액티비티 실행시 동일 Task내에서 실행이 가능하다

 

 singleInstance: 루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능하고 태스크내에 해당

  액티비티 하나만 속할 수 있어 다른 액티비티를 실행시키면 새로운 Task가 생성되어

  (FLAG_ACTIVITY_NEW_TASK와 동일) 그 Task내에 포함된다



- 소스코드에서 플래그를 사용하고 싶을때에는 Intent에 addFlags() 또는 setFlags() 메소드를 사용한다


  FLAG_ACTIVITY_NEW_TASK: 

  동일 affinity의 task가 있으면 그곳에 실행되고 아니면 새로운 task를 실행


  FLAG_ACTIVITY_SINGLE_TOP: 

  상단 singleTop과 같으며, 실행시 재사용 액티비티의 실행은 onPause(), onNewIntent(), onResume()

  순으로 호출된다

  ☞ [B]를 single top설정: [A][B] 상태에서 [B] 호출시 => [A][재사용된B]

  ☞ [B]를 single top설정: [B][A] 상태에서 [B] 호출시 => [B][A][B]


  FLAG_ACTIVITY_NO_HISTORY:

  해당 액티비티는 재활성화시(back키를 눌러 다시 활성화될때) pop 된다

  ☞ [B]를 no history설정: [A][B][A] 상태에서 back키 사용시 [A]가 pop 되고 [B] 역시 

  no history에 의해 pop => [A]


  FLAG_ACTIVITY_REORDER_TO_FRONT:

  activity 호출시 이미 같은 activity가 task내에 있으면 같은 activity는 pop 시키고 해당 activity가 push 된다

  ☞ [A]를 reorder to front설정: [A][B] 상태에서 [A] 호출시 같은 activity인 [A]가 pop되고 => [B][A]


  FLAG_ACTIVITY_CLEAR_TOP:

  해당 task에 있는 모든 activity를 pop 시키고 해당 activity가 root activity로 task에 push된다

  ☞ [A]를 clear top설정: [A][B] 상태에서 [A] 호출시 모두 pop되고 => [A]

  단, 해당 플래그는 액티비티를 모두 onDestroy() 시킨 후 새롭게 onCreate() 시키기 때문에 [A]를

  유지하려면 FLAG_ACTIVITY_SINGLE_TOP 플래그와 함께 사용하면 된다


http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_BROUGHT_TO_FRONT



Clear Task


- Task를 오랫동안 사용하지 않고 방치해 두면 시스템은 Root Activity를 제외한 모든 액티비티를 Clear 시킨다

- 이러한 동작은 Activity의 속성을 수정하여 제어할 수 있다


  alwaysRetainTaskState:

  Task의 Root Activity에 true로 설정되어 있다면 상단에 언급되었던 동작은 발생하지 않으며 Task는

  오랜 시간 이후에도 Stack에 있는 모든 Activity를 유지한다


  clearTaskOnLaunch:

  이 속성이 true로 설정되어 있으면 alwaysRetainTaskState 와 정반대로 사용자가 Task를 떠났다가

  다시 돌아올 때마다 항상 Stack은 Root Activity로 정리된다


  finishOnTaskLaunch:

  이 속성은 clearTaskOnLaunch와 유사하지만 전체 Task가 아닌 단일 Activity에서 동작한다

  그리고 그것은 Root Activity를 포함한 어떤 Activity가 사라지는 원인이 될 수도 있다

  true로 설정되어 있을 때, Activity는 현재 Session 동안 Task의 일부만 유지한다

  만일 사용자가 해당 Task를 벗어났다가 다시 돌아오면 더이상 존재하지 않는다

 

 

+ Recent posts