[AndroidStudio 정리] 안드로이드 태스크 ( Android Task, Activity Stack)
Android Task
-Task는 어플리케이션에서 실행되는 액티비티를 보관하고 관리
-Stack 형태의 연속된 Activity로 이루어진다
-선입후출(First In Last Out)형태로 나중에 적재된 액티비티일 수록 가장 먼저 사용된다
예) 1화면 -> 2화면 -> 3화면 순으로 액티비티를 이동하였을때 실행순서대로 Task에 Push됨
뒤로가기 버튼을 누르면 3화면 -> 2화면 -> 1화면 순으로 Task에서 pop시켜 되돌아간다.
-최초 적재 액티비티는 RootActivity라고 하며 어플리케이션 런처로부터 시작된다
-마지막으로 적재되는 액티비티는 Top Activity라고 하며 현재 화면에 활성화 되어있는 액티비티를 말한다.
-Task의 스택에 넣어져있는 액티비티들은 모두 background와 foreground로 함께 이동한다.
예) - 홈버튼 클릭(task interrupt -> background이동 )
- 홈버튼 롱클릭 ( recent task -> foreground이동 )
-Activity는 Stack에 여러번 인스턴스화 될 수 있다.
※인스턴스란
설계도를 바탕으로 소프트웨어에 구현된 구체적인 실체
클래스 타입으로 선언되었을때 : 객체
객체가 메모리에 할당되어 실제 사용될때 : 인스턴스
객체를 클래스의 인스턴스 라고도 한다.
인스턴스화 : 구체적으로 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음, 그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해 인스턴스를 만드는 것을 말한다.
Intent Flag 을 사용해야하는 이유
-Activity를 호출하다 보면 Activity에 대해 중복 문제가 발생하곤한다. 중복을 방지하거나, Activity에 대한 흐름을 제어하고 싶을 때 사용한다.
-AndroidManifest에서 제어
<activity android:launchMode= “사용하고자 하는 속성”></>
- standard : Stack 중 어느 곳에나 위치 할 수 있으며, 여러개의 인스턴스가 생성 가능하다.
- singleTop : Stack 중 어느 곳에나 위치 할 수 있으며, 여러개의 인스턴스가 생성 가능하고 호출한 Activity와 최상위 Activity가 동일한 경우 최상위 Activity가 재사용되고, 기존 최상위 Activity는 pop() 처리됨
- singleTask : Root Activity로만 존재하며 하나의 인스턴스만 생성 가능, 다른 액티비티 실행시 동일 Task 내에서 실행 가능
- singleInstance : Root Activity로만 존재하며 하나의 인스턴스만 생성 가능, Task 내에 해당 Activity 하나만 속할 수 있다. 다른 Activity를 실행시키면 새로운 Task가 생성되어 그 Task에 포함되게 된다.
-소스 코드로 제어
Intent.addFlags() 메서드 또는 Intent.setFlags() 사용
Ex) intent.addFlags(Intent.사용 플래그);
< addFlags()와 setFlags()의 차이 >
addFlags() : 새로운 flag를 기존 flag에 붙임
setFlags() : 오래된 flag 전체를 대체
- FLAG_ACTIVITY_BROUGHT_TO_FRONT
시스템 디폴트값, 같은 Task에 Activity가 있을 경우에 Activity 실행모드가 singleTask이면 자동으로 설정됨
- FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
Task가 리셋될 때 플래그가 사용된 Activity부터 위의 Activity가 모두 삭제됨
Ex) ABCD → B call → AB
- FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
시스템에 의해 홈에서 사용자에 의해 백그라운드에 있던 Task가 포그라운드로 전환될 때에 항상 붙게 됨
Intent를 이용하여 새로운 Task를 생성하거나 존재하고 있는 Task를 포그라운드로 가져오는 경우가 아닌 경우에는 아무런 효과가 없다.
- FLAG_ACTIVITY_CLEAR_TOP
호출하는 Activity가 스택에 있을 경우, 해당 Activity를 최상위로 올리면서, 그 위에 있던 Activity들을 모두 삭제하는 Flag
RootActivity와 동일한 Activity만 남긴 후 Stack에 쌓여 있는 나머지 Activity를 모두 onDestroy() 시키는 Flag
속성이 적용된 Activity는 onCreate()부터 시작됨
Ex) ABCDE → C call → ABC
cf) onCreate()가 아닌 재사용만 하고 싶을 경우, FLAG_ACTIVITY_SINGLE_TOP 속성과 같이 사용하면 됨


- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
최근 실행목록에 표시하지 않길 원하는 Activity가 있을 경우 사용하면 표시되지 않음
- FLAG_ACTIVITY_FORWARD_RESULT
startActivityForResult를 이용해서 Activity를 호출한 이후, 호출하는 쪽이 아닌 한번 더 거쳐서 Result를 받고 싶은 경우에 쓰임
Ex) A → B → C , C에서 setResult 설정, B에서 finish 하게 되면 A → C 로 값을 받을 수 있게 됨
- FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
시스템에 의해서 설정되는 Flag, 최근 실행목록에서 실행되게 되면 자동으로 설정됨
- FLAG_ACTIVITY_MULTIPLE_TASK
FLAG_ACTIVITY_TASK와 함께 사용하여야 하며, 두 개의 Flag를 동시에 사용할 경우Task는 재활용되지 않고 무조건 새로 생성되며, 피호출되는 Activity는 새로운 Task의 최상위 Activity가 됨
- FLAG_ACTIVITY_NEW_TASK
새로운 Task를 생성하여 그 Task 안에 Activity를 추가할 때 사용, 기존에 있던 Task들 중에 생성하려는 Activity와 동일한 Affinity를 가지고 있는 Task가 있다면 그 곳으로 Activity가 들어가게 됨
<Affinity>
Activity들은 하나의 Affinity를 가지고 있다.
AndroidManifest에서 <activity> 태그의 taskAffinity 속성을 사용해 개별로 affinity를 지정할 수 있다.
FLAG_ACTIVITY_NEW_TASK Flag를 가진 Intent 객체로부터 호출된 allowTaskReparenting 속성을 True로 가지고 있는 Activity에 한해 Affinity가 동작한다.
하나의 어플리케이션 내에서 하나 이상의 기능을 갖는 어플리케이션이 있을 경우 각 액티비티별로 다른 Affinity를 지정해 관리 할 수 있다.
- FLAG_ACTIVITY_NO_ANIMATION : Activity 전환 시 애니메이션 무시
- FLAG_ACTIVITY_NO_HISTORY : Activity가 Stack에 쌓이지 않게 함, 로딩 화면(SplashActivity) 등에 사용


- FLAG_ACTIVITY_SINGLE_TOP
호출되는 Activity가 최상위에 있을 경우 해당 Activity를 다시 생성하지 않고, 있던 Activity를 다시 사용
cf) 동일한 Activity가 연속적으로 사용되어야만 Flag Activity가 적용됨
재사용 Activity는 onPause(), onNewIntent(), onResume() 순서로 동작하게 됨
Ex) ABC → C call → ABC


- FLAG_ACTIVITY_REORDER_TO_FRONT
실행하고자 하는 Activity가 Task에 있으면생성하는 대신 순서를 가장 위로 올림
순서를 역전해서 올리기 때문에 잘못 사용하게 되면 Activity의 흐름이 꼬일 수 있는 문제점이 있다.

액티비티를 작업의 진입 지점으로 설정하려면
<activity ... >
<intent-filter ... >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity>
사용자는 Task를 떠났다가 이 액티비티 launcher를 사용하여 나중에 작업에 돌아올 수 있어야 한다.
이러한 이유로, 액티비티가 항상 Task를 시작하는 것으로 표시하는 두 가지 launch mode, 즉 “singleTask” 및 “singleInstance”는 액티비티에 ACTION_MAIN 및 CATEGORY_LAUNCHER 필터가 있을 때에만 사용되어야 한다고한다.
안드로이드/Android 태스크란? (Task, Activity Stack) 어피니티란? (Android Affinity) 플래그란? (Android Flag)
안드로이드/Android 태스크란? (Task, Activity Stack) 어피니티란? (Android Affinity) 플래그란? (Android Flag) 태스크란? (Task, Activity Stack) 어피니티란? (Android Affinity) 플래그란? (Android Flag)..
arabiannight.tistory.com
https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html
[Java] 클래스, 객체, 인스턴스의 차이 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
[안드로이드] Intent(4) - 인텐트 플래그를 이용한 Activity 스택 관리
[안드로이드] Intent(4) - 인텐트 플래그를 이용한 Activity 스택 관리 4. 인텐트 플래그를 이용한 Activity 스택 관리 => 사용법 : intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); ▪ FLAG_ACTIVITY_SINGLE_..
vzio.tistory.com
https://onemask514.tistory.com/43
[Android] Android Stack 관리 / 확인하기
안드로이드 앱은 여러 개의 Activity로 관리된다. 오늘은 여러 개의 Activity를 관리/확인 하는 법에 대해 알아보자. # Activity Stack 여러 Activity 는 Stack 형태로 관리된다. OneActivity에서 TwoActivity를..
onemask514.tistory.com
https://colinch4.github.io/2020-12-01/Activity(3)-Activity-Task-and-Back-Stack/
colin's 블로그
개발 강좌 블로그
colinch4.github.io