Activity LaunchMode ์คํ๐ฉโ๐ฌ
๊ฐ launchMode๋ฅผ ํท๊ฐ๋ฆฌ์ง ์๊ณ ์ฐ๊ธฐ ์ํด ํ ์คํธ ํด๋ณด๊ณ ์ ๋ฆฌํด๋ณด์์ต๋๋ค. ์๋ ํ ์คํธ ๋ด์ฉ๋ค์ ๊นํ ๋ ํฌ์์ ๋ธ๋์น๋ณ๋ก ํ์ธํ๊ณ ๋ค๋ฅธ ๊ถ๊ธํ ๊ฒ๋ค์ ํ ์คํธํด๋ณด๋ฉด ์ฌ๋ฐ์ ๊ฒ ๊ฐ์ต๋๋ค. ๐ค
Launch Mode
๐งช Standard
Standard๋ AndroidManifest์ launchMode์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก launchMode ํ๋๋ฅผ ์๋ตํด๋ ์ค์ ๋ฉ๋๋ค. Standard๊ฐ ์ค์ ๋ Activity๋ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ํ Task ์์์๋ ์ฌ๋ฌ ๋ฒ ์ธ์คํด์คํ ๋ ์ ์์ผ๋ฉฐ ์ฌ๋ฌ ๋ค๋ฅธ Task์์์๋ ์ํ ์ ์์ต๋๋ค. Standard ๋ชจ๋์ธ B Activity๋ Task 1 ์์๋ ์ฌ๋ฌ ๋ฒ ์ธ์คํด์คํ ๋์ด์์ผ๋ฉฐ Task 2 ์๋ ์กด์ฌํ๊ณ ์์ต๋๋ค.
final static String STARTED_CNT = "STARTED_CNT";
final static int RETRY_CNT = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int startedCnt = getIntent().getIntExtra(STARTED_CNT, 0);
Intent recursiveIntent = new Intent(this, MainActivity.class);
recursiveIntent.putExtra(STARTED_CNT, ++startedCnt);
if (startedCnt < RETRY_CNT) {
startActivity(recursiveIntent);
}
}
์์ ๊ฐ์ ์์ค๋ก ๊ฐ์ Activity๋ฅผ ์ฌ๋ฌ ๋ฒ ๋์ ์ ๋ onNewIntent๋ ์คํ๋์ง ์์ผ๋ฉฐ onCreate ๋ง ์คํ์ด ๋์์ต๋๋ค. ๋ํ ์๋์ ๊ฐ์ด ํ ์คํ ์์ ์ฌ๋ฌ ๋ฒ ์ธ์คํด์ค ํ ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๐งช SingleTop
๋ง ๊ทธ๋๋ก ์ด launchMode๋ฅผ ์ค์ ํ Activity๋ Task์ Top์์ ์ฐ๋ฌ์ ์กด์ฌํ ์ ์์ต๋๋ค. Top์์๋ Single, 1๊ฐ๋ง ์กด์ฌํ ์ ์์ต๋๋ค. Activity์ ์ธ์คํด์ค๊ฐ Task์ ์ต์๋จ์ ์์ ๊ฒฝ์ฐ, ํด๋น Activity๋ฅผ ๋ค์ startActivityํ๋ฉด onCreate๊ฐ ๋ถ๋ฆฌ์ง ์๊ณ onNewIntent๊ฐ ํธ์ถ๋์ด Acitivity์ ์ธ์คํด์ค๊ฐ Task์ ์ถ๊ฐ๋์ง ์์ต๋๋ค. ๊ธฐ์กด instance๋ฅผ ์ฌํ์ฉํ๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ํ์ง๋ง Top์ด ์๋ Task์ ๋ค๋ฅธ ์์น์์๋ ์ฌ๋ฌ ๋ฒ ์ธ์คํด์คํ ๋ ์ ์์ต๋๋ค.
์์ ๊ฐ์ด B Activity์ singleTop์ด ์ค์ ๋์ด์๋ ๊ฒฝ์ฐ ์ผ์ชฝ ๋ชจํ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ ์ค๋ฅธ์ชฝ ๋ชจํ์ ๊ฐ๋ฅํฉ๋๋ค.
launchMode๋ฅผ ๋ฐ๊พธ๊ณ [์์ค 1]์ ์ฌ์คํํด๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๐งช SingleTask
singleTop์ด ์์์ ์์ ๋๋ง ๊ธฐ์กด ์ธ์คํด์ค๋ก ๋ผ์ฐํ ํด์ค๋ค๋ฉด, singleTask๋ Task๋ด์ ๋จผ์ ์์๋ ์์ ์๊ฒ๋ก ๋ผ์ฐํ ํด์ค๋๋ค. ์ฆ Task๋ด์ ์์ ์ด ์กด์ฌํ๋ค๋ฉด ์์ ์ผ๋ก ๋ผ์ฐํ ํ๊ณ , ์๋ค๋ฉด ์ ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋๋ฌธ์ ์ ๋ launchMode๋ณด๋ค ์ด singleTask๋ชจ๋๊ฐ ๋ชจํธํ ๋ถ๋ถ์ด ์์์ต๋๋ค. ์๋ ์คํ์ ํตํด์ ์ด launchMode์ ํน์ดํ ์ ๋ค์ ํ์ธํด๋ณด์์ต๋๋ค.
โ๏ธ 1. SingleTask๋ก ์ค์ ๋ Activity๋ก onNewIntent๋ ๋, ๊ทธ ์ค๊ฐ์ ์๋ Activity๋ค์ ๋ชจ๋ onDestroy๋๋ค.
MainActivity์ SingleTask๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ ์ผ์ชฝ์ Task ์ํฉ์์ MainActivity๋ฅผ startActivityํ๋ฉด ์ค๊ฐ์ Second, ThirdActivity๋ onDestroy๋๊ณ ์ค๋ฅธ์ชฝ Task๋ชจํ์ฒ๋ผ MainActivity๋ง ๋จ๊ฒ ๋ฉ๋๋ค.
์ ๊ทธ๋ฆผ์์ ๊ฐ 3๊ฐ์ Activity๋ ์๋์ ๊ฐ์ ์ค์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- MainActivity(A TaskAffinity, SingleTask)
- SecondActivity(A TaskAffinity, Standard)
- ThirdActivity(A TaskAffinity, Standard)
Main -> Second -> Third -> Main
์์ผ๋ก ํธ์ถํ๋ฉด ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ ์คํ์ ๋น๊ต์ ๊ฐ๋จํ์ฌ ๋ก๊ทธ์บฃ์ผ๋ก๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ด์ฐฐํ์์ต๋๋ค.
ThirdActivity onDestroy๊ฐ MainActivity onNewIntent๋ณด๋ค ๋ฆ๊ฒ ๋ถ๋ ธ๋ค๋ ๋ณ์๊ฐ ์์ง๋ง ๊ฒฐ๋ก ์ ์ผ๋ก Second, ThirdActivity๋ onDestroy๋์์ต๋๋ค.
(์ฐธ๊ณ ๋ก Galaxy s8+(Android 9)์์ 5๋ฒ ์คํํ์ฌ๋ ์๋ ๊ฒฐ๊ณผ์ ์์๋ ๋๊ฐ์์ต๋๋ค.)
โ๏ธ 2. ๋ค๋ฅธ Task์์ ์๋ singleTask Activity์๊ฒ๋ ๋ผ์ฐํ ๋๋ค.
์์ ๊ฐ์ ์คํ์ ํ๊ธฐ ์ํด์ taskAffinity๋ฅผ ๋ฌ๋ฆฌํ๋ Activity๋ฅผ ํ๋ ์ถ๊ฐํ์์ต๋๋ค. ๋ ์๋ก ์์ฑ๋๋ Acitivity๋ ์ด์ Activity์ Task๋ฅผ ๋ฐ๋ผ๊ฐ๋ ์ ์ ์ด์ฉํ์ฌ ์๋์ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค์์ต๋๋ค.
์ฐ์ ๊ฐ 4๊ฐ์ Activity๋ ์๋์ ๊ฐ์ ์ค์ ์ด ๋์ด์์ต๋๋ค.
- MainActivity(A TaskAffinity, singleTask)
- SecondActivity(A TaskAffinity, standard)
- ThirdActivity(A TaskAffinity, standard)
- OtherTaskActivity(B TaskAffinity, standard)
Main -> Second -> Other -> Third -> Main
์์ ๊ฐ์ ์ค์ ์ผ๋ก ์คํ์ ํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค.
์์ ๊ฐ์ด ThirdActivity ๊น์ง ํธ์ถํ ๊ฒฝ์ฐ ์ผ์ชฝ ๋ชจํ๊ณผ ๊ฐ์ ์ํฉ์ด ๋๋ฉฐ ThirdActivity์์ ๋ค์ MainActivity๋ฅผ ๋ถ๋ฅผ ๊ฒฝ์ฐ A Task ์์ผ๋ก ๋ผ์ฐํ ๋ฉ๋๋ค. ๋ ํนํ ์ ์ A Task์ ์์ Activity์ธ SecondActivity๋ง onDestory๋์์ผ๋ฉฐ B Task์ Activity๋ค์ ๋จ์์์์ต๋๋ค.
์ ์คํ์ adb๋ฅผ ํตํด์ ๊ด์ฐฐํ๋ฉด
์ฆ singleTask๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ Activity๋ ์ ์ฒด Task์์ ํ๋๋ง ์กด์ฌํ ์ ์์ต๋๋ค. ๋ ๋ผ์ฐํ ์ ์์ํ๋ Task์ ์๋ Activity๋ค์ ์ข ๋ฃ๋์ง ์์ผ๋ฉฐ(B Task) ๋ผ์ฐํ ์ด ๋์ฐฉํ๋ ๊ณณ์ ์๋ ๊ธฐ์กด์ ์๋ singleTask์์์ Activity๋ค์ onDestroy๋ฉ๋๋ค.(A Task) (์ด ๋ถ๋ถ์ ์์ผ๋ก๋ ์์ธ๊ฐ ์๋ค๋ฉด ์ถ๊ฐํ๊ฒ ์ต๋๋ค. ๋ ๋ฐ๋์ผ์ด์ค๋ฅผ ์๊ณ ๊ณ์ ๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์๐)
๐งช SingleInstance
singleInstance๋ singleTask์ ๋น์ทํ๋ singleInstance๋ก ์ง์ ๋ Activity๊ฐ ์๋ Task์๋ ๋ค๋ฅธ Activity๊ฐ ์ถ๊ฐ๋์ง ์๋๋ค๋ ์ ์ด ๋ค๋ฆ ๋๋ค. ๋ฐ๋ผ์ A activity๊ฐ singleInstance์ด๊ณ ์ดํ์ Activity๋ค์ ๋ค๋ฅธ Task์์ ์์นํ๊ฒ ๋ฉ๋๋ค. ์ด ์ฐจ์ด๋ก ์ธํด singleTask์์ ํ ์คํ์ 1๋ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค.
์๋์ ๊ฐ์ด Activity 3๊ฐ๋ฅผ ์ค์ ํด๋์์ต๋๋ค.
- MainAcitivty(A TaskAffinity, singleInstance)
- SecondActivity(A TaskAffinity, standard)
- ThirdActivity(A TaskAffinity, standard)
Main -> Second -> Third -> Main
์์ ๊ฐ์ ์์๋ก Activity๋ค์ ํธ์ถํ์์ ๋ Second, Third๋ ๋ค๋ฅธ Task๋ก ๋ถ๋ฆฌ๊ฐ ๋ฉ๋๋ค. ์ด ํ ThirdActivity์์ MainActivity๋ฅผ ํธ์ถํ์์ ๋ A Task์ MainActivity๋ก ๋ผ์ฐํ ๋์ด onNewIntent๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ด ๋ singleTask์ 2๋ฒ ์คํ์์ ๋ผ์ฐํ ์ด ์์๋๋ Task์ Activity๋ค์ onDestroy๋์ง ์์๋ ๊ฒ์ฒ๋ผ, singleInstance ์ญ์ ๋ค๋ฅธ Task์ ๋ค๋ฅธ Activity๋ค์ด ๋ถ๋ฆฌ๋์ด์์ผ๋ ๋ค๋ฅธ Activity๋ค์ด onDestroy๋์ง ์์ต๋๋ค.
์ฆ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ์ํฉ์ด ๋์ด adb๋ก ๊ด์ฐฐํ์ฌ๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ต๋๋ค. SecondActivity, ThirdActivity ๋ MainActivity์ ๋ค๋ฅธ Task์ ์์นํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
(+ singleInstance ์ถ๊ฐ ์คํ)
๊ทธ๋ ๋ค๋ฉด ๋ค๋ฅธ Activity๊ฐ singleInstance๊ฐ ์ ์ธ๋ Activity๋ฅผ ํธ์ถํ์ฌ๋ Task๊ฐ ๋ถ๋ฆฌ๋ ์ ์์๊น?
์๋ ํ ์คํธ ์์๋ฅผ ํตํด ์์ ์ํฉ๋ ํ ์คํธํด๋ณด์์ต๋๋ค. ๋๊ฐ์ด Activity 3๊ฐ๋ฅผ ์ค์ ํด๋์์ต๋๋ค.
- MainAcitivty(A TaskAffinity, standard)
- SecondActivity(A TaskAffinity, singleInstance)
- ThirdActivity(A TaskAffinity, standard)
Main -> Second -> Third -> Main
์์ ๊ฐ์ ์ธํ ์ผ๋ก ํ ์คํธ๋ฅผ ํ ๊ฒฝ์ฐ SecondActivity๋ ๋ค๋ฅธ Task์ ๋ถ๋ฆฌ๋๋ฉฐ ๊ทธ ์ดํ์ ์คํ๋ ThirdActivity๋ A Task๋ก ๋ค์ ๋์์ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
adb๋ก ํ์ธํด ๋ณด์๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.



