Logo
Droid Lab by Bonny

Activity LaunchMode ์‹คํ—˜๐Ÿ‘ฉโ€๐Ÿ”ฌ

2021๋…„ 2์›”

๊ฐ launchMode๋ฅผ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ณ  ์“ฐ๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ณ  ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํ…Œ์ŠคํŠธ ๋‚ด์šฉ๋“ค์€ ๊นƒํ—™ ๋ ˆํฌ์—์„œ ๋ธŒ๋žœ์น˜๋ณ„๋กœ ํ™•์ธํ•˜๊ณ  ๋‹ค๋ฅธ ๊ถ๊ธˆํ•œ ๊ฒƒ๋“ค์„ ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉด ์žฌ๋ฐŒ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿค—

๊ด€๋ จ Android Docs ๋งํฌ

์‹คํ—˜ code github

Launch Mode

๐Ÿงช Standard

Standard๋Š” AndroidManifest์˜ launchMode์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ launchMode ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•ด๋„ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. Standard๊ฐ€ ์„ค์ •๋œ Activity๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ•œ Task ์•ˆ์—์„œ๋„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ธ์Šคํ„ด์Šคํ™” ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ Task์•ˆ์—์„œ๋„ ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Standard ๋ชจ๋“œ์ธ B Activity๋Š” Task 1 ์—์„œ๋„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ธ์Šคํ„ด์Šคํ™” ๋˜์–ด์žˆ์œผ๋ฉฐ Task 2 ์—๋„ ์กด์žฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 2021 02 activity launchmode experiment1

    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 ๋งŒ ์‹คํ–‰์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•œ ์Šคํƒ ์•ˆ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์ธ์Šคํ„ด์Šค ํ™” ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2021 02 activity launchmode experiment2


๐Ÿงช SingleTop

๋ง ๊ทธ๋Œ€๋กœ ์ด launchMode๋ฅผ ์„ค์ •ํ•œ Activity๋Š” Task์˜ Top์—์„œ ์—ฐ๋‹ฌ์•„ ์กด์žฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Top์—์„œ๋Š” Single, 1๊ฐœ๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Activity์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ Task์˜ ์ตœ์ƒ๋‹จ์— ์žˆ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น Activity๋ฅผ ๋‹ค์‹œ startActivityํ•˜๋ฉด onCreate๊ฐ€ ๋ถˆ๋ฆฌ์ง€ ์•Š๊ณ  onNewIntent๊ฐ€ ํ˜ธ์ถœ๋˜์–ด Acitivity์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ Task์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด instance๋ฅผ ์žฌํ™œ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Top์ด ์•„๋‹Œ Task์˜ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ์ธ์Šคํ„ด์Šคํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2021 02 activity launchmode experiment3

์œ„์™€ ๊ฐ™์ด B Activity์— singleTop์ด ์„ค์ •๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์™ผ์ชฝ ๋ชจํ˜•์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ์˜ค๋ฅธ์ชฝ ๋ชจํ˜•์€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

launchMode๋ฅผ ๋ฐ”๊พธ๊ณ  [์†Œ์Šค 1]์„ ์žฌ์‹คํ–‰ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2021 02 activity launchmode experiment4


๐Ÿงช SingleTask

singleTop์ด ์ƒ์œ„์— ์žˆ์„ ๋•Œ๋งŒ ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋กœ ๋ผ์šฐํŒ…ํ•ด์ค€๋‹ค๋ฉด, singleTask๋Š” Task๋‚ด์˜ ๋จผ์ € ์‹œ์ž‘๋œ ์ž์‹ ์—๊ฒŒ๋กœ ๋ผ์šฐํŒ…ํ•ด์ค๋‹ˆ๋‹ค. ์ฆ‰ Task๋‚ด์— ์ž์‹ ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์ž์‹ ์œผ๋กœ ๋ผ์šฐํŒ…ํ•˜๊ณ , ์—†๋‹ค๋ฉด ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์œ„ ๋‘ launchMode๋ณด๋‹ค ์ด singleTask๋ชจ๋“œ๊ฐ€ ๋ชจํ˜ธํ•œ ๋ถ€๋ถ„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‹คํ—˜์„ ํ†ตํ•ด์„œ ์ด launchMode์˜ ํŠน์ดํ•œ ์ ๋“ค์„ ํ™•์ธํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.


โœ๏ธ 1. SingleTask๋กœ ์„ค์ •๋œ Activity๋กœ onNewIntent๋  ๋•Œ, ๊ทธ ์ค‘๊ฐ„์— ์žˆ๋Š” Activity๋“ค์€ ๋ชจ๋‘ onDestroy๋œ๋‹ค.

MainActivity์— SingleTask๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ ์™ผ์ชฝ์˜ Task ์ƒํ™ฉ์—์„œ MainActivity๋ฅผ startActivityํ•˜๋ฉด ์ค‘๊ฐ„์˜ Second, ThirdActivity๋Š” onDestroy๋˜๊ณ  ์˜ค๋ฅธ์ชฝ Task๋ชจํ˜•์ฒ˜๋Ÿผ MainActivity๋งŒ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

2021 02 activity launchmode experiment5

์œ„ ๊ทธ๋ฆผ์—์„œ ๊ฐ 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๋ฒˆ ์‹คํ—˜ํ•˜์—ฌ๋„ ์•„๋ž˜ ๊ฒฐ๊ณผ์˜ ์ˆœ์„œ๋Š” ๋˜‘๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.)

2021 02 activity launchmode experiment6


โœ๏ธ 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

์œ„์™€ ๊ฐ™์€ ์„ค์ •์œผ๋กœ ์‹คํ—˜์„ ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

2021 02 activity launchmode experiment7

์œ„์™€ ๊ฐ™์ด ThirdActivity ๊นŒ์ง€ ํ˜ธ์ถœํ•œ ๊ฒฝ์šฐ ์™ผ์ชฝ ๋ชจํ˜•๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋˜๋ฉฐ ThirdActivity์—์„œ ๋‹ค์‹œ MainActivity๋ฅผ ๋ถ€๋ฅผ ๊ฒฝ์šฐ A Task ์•ˆ์œผ๋กœ ๋ผ์šฐํŒ… ๋ฉ๋‹ˆ๋‹ค. ๋…ํŠนํ•œ ์ ์€ A Task์˜ ์ƒ์œ„ Activity์ธ SecondActivity๋งŒ onDestory๋˜์—ˆ์œผ๋ฉฐ B Task์˜ Activity๋“ค์€ ๋‚จ์•„์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์‹คํ—˜์„ adb๋ฅผ ํ†ตํ•ด์„œ ๊ด€์ฐฐํ•˜๋ฉด

2021 02 activity launchmode experiment8

A Task

2021 02 activity launchmode experiment9

B Task

์ฆ‰ 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๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2021 02 activity launchmode experiment10

์ฆ‰ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋˜์–ด adb๋กœ ๊ด€์ฐฐํ•˜์—ฌ๋„ ๊ฒฐ๊ณผ๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค. SecondActivity, ThirdActivity ๋Š” MainActivity์™€ ๋‹ค๋ฅธ Task์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2021 02 activity launchmode experiment11


(+ 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๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2021 02 activity launchmode experiment12

adb๋กœ ํ™•์ธํ•ด ๋ณด์•„๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2021 02 activity launchmode experiment13

A Task

2021 02 activity launchmode experiment14

B Task
์ถ”์ฒœ
ํด๋ฆฐ ์•„ํ‚คํ…์ณ๋ฅผ ์ง€ํ–ฅํ•ด์•ผํ•˜๋Š” ์ด์œ 
ํด๋ฆฐ ์•„ํ‚คํ…์ณ๋ฅผ ์ง€ํ–ฅํ•ด์•ผํ•˜๋Š” ์ด์œ 
2024๋…„ 1์›”
MVC, MVP, MVVM, MVI ์•„ํ‚คํ…์ณ ์•ˆ๋“œ๋กœ์ด๋“œ ์ฝ”๋“œ๋กœ ์•Œ์•„๋ณด๊ธฐ - 1
MVC, MVP, MVVM, MVI ์•„ํ‚คํ…์ณ ์•ˆ๋“œ๋กœ์ด๋“œ ์ฝ”๋“œ๋กœ ์•Œ์•„๋ณด๊ธฐ - 1
2023๋…„ 11์›”
Compose Side Effect์—์„œ ๋‚ด๊ฐ€ ์ž˜ ๋ชป ์ดํ•ดํ•œ ๊ฒƒ๋“ค ๐Ÿ™…โ€โ™€๏ธ
Compose Side Effect์—์„œ ๋‚ด๊ฐ€ ์ž˜ ๋ชป ์ดํ•ดํ•œ ๊ฒƒ๋“ค ๐Ÿ™…โ€โ™€๏ธ
2023๋…„ 4์›”
์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ graphql ์‹œ์ž‘ํ•˜๊ธฐ๐Ÿ›ซ
์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ graphql ์‹œ์ž‘ํ•˜๊ธฐ๐Ÿ›ซ
2023๋…„ 2์›”
๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
Loading script...
Designed by Tony / Written by Bonny