Activity
- 앱의 진입점
- 앱은 항상 동일한 위치에서 시작하는 게 아니라 여러 위치에서 시작 가능
예를 들어, 이메일 앱은 이메일 목록화면부터 시작할 수도 있지만 다른 앱에서 바로 이메일 작성 화면으로 시작할 수도 있다.
- 이 각각의 진입가능한 지점들이 액티비티가 되고 앱은 여러개의 액티비티로 구성되는 것
- UI를 그리고 사용자와 상호작용 담당
- manifest 파일이 액티비티들을 관리
Task
- 사용자가 특정 작업을 할 때 사용하는 액티비티들의 모음
- 한 앱에 여러 Task가 있을 수 있음
- 액티비티들이 다 destroy되어서 없어지면 task도 사라짐
최근 화면 (recent screen)
- overview screen이라고도 하는데 접근 가능한 작업 목록들을 볼 수 있다.
- 동일 앱에 대해서도 여러 작업이 존재하면 여러 개 보일 수 있다.

Back Stack
- task의 액티비티는 back stack에 쌓인다.
- task마다 독자적인 back stack을 가짐
- 이 중 foreground에 있는 task만 사용자에게 보여지는 것

- root activity만 남아있는 task에서 back gesture를 한다면?
- 11버전 이전 -> 액티비티 종료
- 12버전 이후 -> task를 background로 보냄 (홈 버튼 눌렀을 때처럼)
- 다시 앱 시작할 때 빨리 resume할 수 있게 하려고 그렇다.
- 만약, 새로운 task를 만들고 싶거나 루트 액티비티만 남기고 스택을 비우고 싶은 경우, manifest 파일의 속성 또는 startActivity에서 Intent에 flag값을 통해서 설정해줄 수 있다.
LaunchMode
manifest에 명시
- activity A가 activity B를 호출할 때의 launch mode이므로 activity B의 activity attribute에 추가
standard
- 기본 모드. 호출할 때마다 새로운 인스턴스를 만들기 때문에 한 task에 동일한 액티비티의 여러 인스턴스 또는 여로 task에 걸쳐 여러 인스턴스가 존재할 수 있다.
singleTop
- 새로 호출한 액티비티가 현재 task의 top에 있는 액티비티랑 동일하면 그 액티비티를 사용하고 해당 액티비티에 onNewIntent()를 호출한다. 여러 task에 여러 인스턴스가 존재할 수 있고 top 액티비티가 아니었다면 한 task에도 여러 인스턴스가 존재할 수 있다.
singleTask
- 새로운 task의 루트 액티비티로 시작하거나 동일 affinity를 가지는 task 내에 인스턴스가 존재하면 위에 있던 다른 액티비티들은 destroy하여 기존 인스턴스가 top에 오게 하고 onNewIntent()를 호출한다.

singleInstance
- singleTask와 동일한데 singleTask는 task 위에 다른 액티비티가 쌓여도 되지만 singleInstance는 task에 유일한 인스턴스여야 한다.
- 이 액티비티 이후 호출되는 액티비티들은 다른 task에 생성된다.
singleInstancePerTask
- singleInstance와 동일한데 한 task에 대해서 유일한 인스턴스여야 하는 것일뿐 다른 task에서도 유일한 인스턴스로 존재할 수 있음
- singleInstance는 모든 task에 대해서 유일한 인스턴스
Intent flag로 명시
FLAG_ACTIVITY_NEW_TASK
- 해당 액티비티는 새로운 task에서 시작한다.
- 근데 이미 액티비티의 인스턴스를 가지고 있는 task가 존재하면 그 task를 back stack으로 가져와서 (foreground로 가져와서) 위에 있는 액티비티 destroy하고 onNewIntent() 호출
- singleTask launchMode와 동일
FLAG_ACTIVITY_SINGLE_TOP
- singeTop launchMode와 동일
- 현재 top activity가 동일한 액티비티면 onNewIntent() 아니면 새로운 인스턴스 생성
FLAG_ACTIVITY_CLEAR_TOP
- 현재 task에 실행되고 있는 인스턴스가 있으면 위에 액티비티 destroy하여 top으로 올린 후 onNewIntent() 호출
- 메인 액티비티에서 로그인 액티비티로 넘어가 로그인 완료 후 다시 메인 액티비티로 올 때 사용
- FLAG_ACTIVITY_NEW_TASK랑 같이 써서 현재 task에 있으면 그거 실행하고 없으면 새로운 TASK를 만드는 식으로 구현할 수 있음
ex. 알림을 눌러서 알림에 대한 액티비티를 열 때 해당 액티비티의 인스턴스가 있는 task를 찾아서 위에 있는 액티비티들을 삭제하고 사용할 수 있음
Affanity
- Activity가 속하길 원하는 task를 나타냄
- manifest의 taskAffinity 속성에 원하는 task를 나타앰
- 기본은 "com.example.myapp.task1" 처럼 패키지 이름으로 되어있고 다른 task에서 실행시키게 하고 싶으면 다른 string을 쓰면 된다.
Clear the Back Stack
- 사용자가 오랫동안 task를 실행하지 않으면 시스템은 루트 액티비티만 남기고 나머지는 destroy한다.
- 시스템이 삭제하지 못하도록 막거나 사용자가 task를 떠날때마다 루트 액티비티만 남기고 다 삭제하는 방법 등이 있다.
Start a Task
- task는 launcher activity로 시작한다.
- 만약, 새로운 task를 생성하고 사용자가 나가면 이 task는 background로 들어가게 된다.
- singleTask와 singleInstance를 사용하는 액티비티는 luancher여야 한다.
- 만약, launcher activity가 아니라면 사용자는 다시 이 task로 돌아올 수 있는 방법이 없어진다.
링크
https://developer.android.com/guide/components/activities/tasks-and-back-stack
https://developer.android.com/guide/components/activities/recents