04
14

# Activity

์•ˆ๋“œ๋กœ์ด๋“œ ์ปดํฌ๋„ŒํŠธ(์•กํ‹ฐ๋น„ํ‹ฐ, ์„œ๋น„์Šค, Broadcast Receiver, ContetProvider) ์ค‘ ํ•˜๋‚˜๋กœ, AppCompatActivity๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ๋งŒ๋“ ๋‹ค. ์ˆ˜๋ช…์ฃผ๊ธฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๋ฐฑ์Šคํƒ์—์„œ ๋‚ ์•„๊ฐ€๊ฑฐ๋‚˜, ํ™”๋ฉด ํšŒ์ „๊ฐ™์€ ๊ฒฝ์šฐ(๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ฐ”๋€๋‹ค๊ณ  ์–˜๊ธฐํ•˜๋Š” ๋ถ€๋ถ„)์—๋Š” onPause -> onStop -> onDestroy-> onCreate -> onStart -> onResume ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š”๋ฐ, AppCompatActivity์—์„œ savedInstance๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅ๋œ ๊ฒŒ ์žˆ์œผ๋ฉด onCreate์—์„œ ๊บผ๋‚ด์™€์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ onSaveInstanceState๋Š” onStop๊ณผ onDestroy ์‚ฌ์ด์— ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ์ •๋ณด ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt("value", value)
    }
    
    // ๊บผ๋‚ด์“ธ๋•Œ๋Š” onCreate์—์„œ
    value = savedInstanceState?.getInt("value") ?: 0

onCreate์—์„œ๋งŒ savedInstanceState๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ–๊ธฐ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ ๋ฐฑ์Šคํƒ์œผ๋กœ ๋“ค์–ด๊ฐ„๊ฒƒ์ด๋ผ๋ฉด onPause-> onStop-> onRestart-> onStart-> onResume ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

 

๊ตฌ์„ฑ์š”์†Œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์€ Intent๋ฅผ ํ†ตํ•ด ์ด๋ค„์ง„๋‹ค.

# Intent

๋ช…์‹œ์  ์ธํ…ํŠธ, ์•”์‹œ์  ์ธํ…ํŠธ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ช…์‹œ์  ์ธํ…ํŠธ๋Š” ์‹คํ–‰ํ•  ๋Œ€์ƒ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ •ํ•ด์ ธ์žˆ๋Š” ๊ฒฝ์šฐ๋‹ค.

val intent = Intent(this, SubActivity::class.java)
intent.putExtra("Key", "๋ช…์‹œ์  ์ธํ…ํŠธ")
startActivity(intent)
// ์™ธ๋ถ€ ์•ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ๋„ ๋ช…์‹œ์  ์ธํ…ํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
var intent = Intent()
var name = ComponentName("com.sample.a","com.sample.a.OuterActivity")
intent.setComponent(name)
startActivity(intent)

์ด๋•Œ ComponentName์€ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ์˜ ํŒจํ‚ค์ง€ ๋ช…๊ณผ ํด๋ž˜์Šค ๋ช…์„ ๋ฐ›๋Š”๋‹ค.

    /**
     * Create a new component identifier.
     *
     * @param pkg The name of the package that the component exists in.  Can
     * not be null.
     * @param cls The name of the class inside of <var>pkg</var> that
     * implements the component.  Can not be null.
     */
    public ComponentName(@NonNull String pkg, @NonNull String cls) {
        if (pkg == null) throw new NullPointerException("package name is null");
        if (cls == null) throw new NullPointerException("class name is null");
        mPackage = pkg;
        mClass = cls;
    }

 

์•”์‹œ์  ์ธํ…ํŠธ๋Š” ์•ก์…˜๊ณผ ๋ฐ์ดํ„ฐ๋งŒ ์ง€์ •ํ•ด์ฃผ๊ณ , ์–ด๋–ค ๋Œ€์ƒ์„ ํ˜ธ์ถœํ•  ์ง€๋Š” ์‹œ์Šคํ…œ์— ๋งก๊ธฐ๋Š” ๊ฒฝ์šฐ๋‹ค.

์ง€๋„๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ „ํ™”๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ๊ฐ€ ์ด ์˜ˆ์‹œ์— ํ•ด๋‹นํ•œ๋‹ค.

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"))

์ด intent๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ชฉ๋ก์ด ๋‚˜์˜ค๋ฉด์„œ ์‹œ์Šคํ…œ์ด ์–ด๋–ค ์•ฑ์œผ๋กœ ์‹คํ–‰ํ•  ๊ฒƒ์ธ์ง€ ๋ฌป๋Š” ํŒ์—…์ด ๋‚˜์˜จ๋‹ค.

์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š”๊ฑด ์ˆ˜ํ–‰ํ•  ์•ก์…˜์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ACTION_VIEW๋Š” ๋ฐ์ดํ„ฐ์˜ URL๋กœ ์–ด๋–ค ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ œ์ผ ์ ์ ˆํ•œ ์ง€ ์ฐพ์•„์„œ ์‹คํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๊ณ ์žˆ๋‹ค.

 

๊ตฌ์„ฑ์š”์†Œ๋ผ๋ฆฌ ๋„˜๊ธฐ๋Š” ์ธํ…ํŠธ ๋ง๊ณ , AndroidManifest.xml์— ์ง์ ‘ ๋„ฃ๋Š” Intent๊ฐ€ ์žˆ๋Š”๋ฐ, ์ธํ…ํŠธ ํ•„ํ„ฐ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

<intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ์‹œ๋ฒ„๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์…˜๋“ค์„ ๋ณดํ†ต ์ธํ…ํŠธ ํ•„ํ„ฐ๋กœ ์ง€์ •ํ•ด์„œ ๋„ฃ๋Š”๋‹ค. Launcher ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋„ ์ธํ…ํŠธ ํ•„ํ„ฐ๋‹ค.

ํ•  ์ˆ˜ ์žˆ๋Š”๊ฑด ๋™์ผํ•˜๊ณ , ํŠน์ • ์ธํ…ํŠธ๋ฅผ ๋ฐ›์„์ง€, ๋ง์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •์ ์œผ๋กœ ์„ ์–ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ ์•ฑ์ด ์„ค์น˜๋˜๊ณ ๋‚˜๋ฉด ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ฒŒ๋œ๋‹ค.

์ธํ…ํŠธ์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ธํ…ํŠธ์˜ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” Category๋„ ์žˆ๊ณ , ๋ฒˆ๋“ค์„ ํ†ตํ•ด ๊ฐ’์„ ์ „๋‹ฌํ•  Extra๋„ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธํ…ํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•  flag๋„ ์žˆ๋‹ค. 

    private static final String ATTR_ACTION = "action";
    private static final String TAG_CATEGORIES = "categories";
    private static final String ATTR_CATEGORY = "category";
    private static final String TAG_EXTRA = "extra";
    private static final String ATTR_TYPE = "type";
    private static final String ATTR_IDENTIFIER = "ident";
    private static final String ATTR_COMPONENT = "component";
    private static final String ATTR_DATA = "data";
    private static final String ATTR_FLAGS = "flags";

 

# Task

์•กํ‹ฐ๋น„ํ‹ฐ๋Š” Task๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

๊ด€๋ จ๋œ ์•กํ‹ฐ๋น„ํ‹ฐ๋“ค์„ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•˜๊ณ , ํŒจํ‚ค์ง€๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋”๋ผ๋„ ํ•˜๋‚˜์˜ ํ๋ฆ„์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ Task๋‹ค. Stack ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— BackStack์ด๋ผ๋Š” ์šฉ์–ด๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ƒˆ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ฉด ์ด์ „์ž‘์—…์ด BackStack์œผ๋กœ ๋“ค์–ด๊ฐ€๊ณ  ์‹œ์ž‘ํ•œ ์ž‘์—…์ด Top์— ์œ„์น˜ํ•œ๋‹ค. ๋…ธ๋ž€์ƒ‰ ๋ฐ•์Šค๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋Š”๊ฒŒ Top์ด๊ณ , ๊ทธ ๋ฐ‘์— ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ onStop์ƒํƒœ๋กœ BackStack์— ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด top์ด pop๋˜๊ณ  ๋ฐฑ์Šคํƒ์—์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์˜ฌ๋ผ์˜ค๋ฉฐ, root activity๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€์„œ popํ•˜๋ฉด Task๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค. Android 12 ๋ถ€ํ„ฐ๋Š” root activity์—์„œ pop์‹œํ‚ค๋Š”๊ฒŒ onDestroy๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ํŠน์ด์ ์ด๋‹ค.

 

์ด๋Ÿฐ Task ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰๋ชจ๋“œ๊ฐ€ ์žˆ๋‹ค. ์ธํ…ํŠธ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ, ์ธํ…ํŠธ Flag๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹ ์ด๋ ‡๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค. ๋ชจ๋“  ๋ชจ๋“œ๋ฅผ ๋‘ ๋ฐฉ์‹ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ์ผ๋ถ€ ๋ชจ๋“œ๋Š” ํ•œ ๋ฐฉ์‹์œผ๋กœ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

# ์‹คํ–‰๋ชจ๋“œ

# AndroidManifest.xml์—์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“œ 5๊ฐ€์ง€

# standard

๋””ํดํŠธ ๋ชจ๋“œ๋‹ค. ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ๋ฌด์กฐ๊ฑด ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค. ์ค‘๋ณต๋˜์–ด ์ƒ์„ฑ๋˜๊ณ  ์ค‘๋ณต๋œ ์ธ์Šคํ„ด์Šค๋“ค์€ ๊ฐ๊ฐ ๋…๋ฆฝ๋œ ์ธ์Šคํ„ด์Šค๋‹ค.

 

# singleTop

์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๊ฐ€ ์ด๋ฏธ top์ด๋ผ๋ฉด ์ƒˆ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  onNewIntent๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ƒˆ ์ธ์Šคํ„ด์Šค ๋Œ€์‹  ํ˜„์žฌ ์ธ์Šคํ„ด์Šค๋กœ ๋ผ์šฐํŒ…ํ•œ๋‹ค. ์Šคํƒ์˜ top์ด ํ˜„์žฌ ์ธ์Šคํ„ด์Šค์ธ๊ฒฝ์šฐ์—๋งŒ ์ค‘๋ณต๋ฐฉ์ง€๊ฐ€ ๋˜๊ณ  ๋ฐฑ์Šคํƒ์— ๋“ค์–ด์žˆ๋Š” ์ค‘๋ณต ์ธ์Šคํ„ด์Šค๋Š” ๊ณ ๋ คํ•˜์ง€์•Š๋Š”๋‹ค.

A-B-A๋กœ ์Šคํƒ์ด ์Œ“์—ฌ์žˆ๋Š” ์ƒํƒœ์ด๊ณ , A ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด๋•Œ A-B-A-A๋กœ ๋˜์ง€์•Š๊ณ  A-B-A ๊ทธ๋Œ€๋กœ์ง€๋งŒ onNewIntent๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด์ „ ์Šคํƒ์— ์Œ“์—ฌ์žˆ๋Š” A๋Š” ๊ด€๋ จ์—†๋‹ค๋Š” ์ด์•ผ๊ธฐ๋‹ค. ์ƒˆ ์ธํ…ํŠธ๊ฐ€ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€์•Š๋Š”๋‹ค ๋ฟ์ด์ง€ onNewIntent๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „ ์ธ์Šคํ„ด์Šค๋ž‘์€ ๋‹ค๋ฅธ Intent๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ด์•ผ๋œ๋‹ค.

override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
    }

 ์—ฌ๊ธฐ์„œ intent๋ฅผ ์žก์•„์„œ setIntent๋ฅผ ํ•ด์ฃผ๋ฉด onResume ๋•Œ ์ƒˆ๋กœ์šด intent๋ฅผ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋œ๋‹ค.

 

# singleTask

์œ„์น˜์— ์ƒ๊ด€์—†์ด ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ™์€ Task์˜ ์Šคํƒ์— ์žˆ์œผ๋ฉด, ๊ฑฐ๊ธฐ๋กœ onNewIntent๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๋ผ์šฐํŒ…ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์œ„์— ์Œ“์—ฌ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋“ค์„ ๋ชจ๋‘ ๋‚ ๋ฆฐ๋‹ค.

A-B-C-D ์˜ ๊ฒฝ์šฐ์—์„œ A๋ฅผ ์ƒˆ๋กœ singleTask๋กœ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, B-C-D๊ฐ€ ๋‹ค ๋‚ ์•„๊ฐ€๊ณ  A๋งŒ ๋‚จ๋Š”๋‹ค.

๋‹ค๋งŒ ๋™์ผ Task๋‚ด์— ์Œ“์—ฌ์žˆ๋Š” ์Šคํƒ์— ํ•œ์ •๋œ๋‹ค.

Task๊ฐ€ ๋‘ ๊ฐœ์ด๊ณ , ๊ฐ๊ฐ์˜ Task๋‚ด์— ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, singleTask๋Š” ํ˜ธ์ถœ ํ•œ Task์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค. 

๋‹ค๋ฅธ Task์— ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กฐ๊ธˆ ๋ณต์žกํ•œ๋ฐ

singleTask๋กœ ์ง€์ •ํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ X,Y๊ฐ€ ๋‹ค๋ฅธ Task์— ์Œ“์—ฌ์žˆ๊ณ , Y๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋ถˆ๋Ÿฌ์™”๋‹ค๋ฉด, Y๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” Task๊ฐ€ ๋ถˆ๋ ค์˜ค๊ฒŒ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ฆผ์ƒ 1-2-Y๊ฐ€ ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, 1-2-X-Y๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— top์— Y๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ•œ๋‹ค๋ฉด 2๊ฐ€ ์•„๋‹ˆ๋ผ X๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.

 

# singleInstance

์ด๊ฑด singleTask์˜ ๋ฒ”์œ„๋ฅผ ์ „์ฒด๋กœ ํ™•์žฅํ•œ ๊ฒƒ์ด๋‹ค.

๋ชจ๋“  Task์—์„œ ๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ํ—ˆ์šฉํ•œ๋‹ค.

 

# singleInstancePerTask

์•กํ‹ฐ๋น„ํ‹ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, Task์˜ root activity๋กœ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” FLAG๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Task๊ฐ€ ํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ๋˜๋Š” ๋ชจ๋“œ๋‹ค.

 

# noHistory

launchMode๋กœ ์„ค์ •ํ•˜๋Š” ๋ชจ๋“œ๋Š” ์•„๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ History๋ฅผ ๋‚จ๊ธฐ์ง€ ๋ง๋ผ๊ณ  ์ง€์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, task stack์— ์Œ“์ด์ง€ ์•Š๋Š”๋‹ค.

# ์ธํ…ํŠธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“œ ์ •์˜

์ธํ…ํŠธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ManifestํŒŒ์ผ์— ์ •์˜ํ•  ๋•Œ ๋ณด๋‹ค ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„ˆ๋ฌด ์–‘์ด ๋งŽ์œผ๋‹ˆ๊นŒ ๊ณต์‹๋ฌธ์„œ์— ์†Œ๊ฐœ๋œ ๊ฒƒ๋“ค๋งŒ ์ •๋ฆฌํ•˜๊ฒ ๋‹ค.

# FLAG_ACTIVITY_NEW_TASK

= singleTask์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด๋‹ค. ๊ทผ๋ฐ ์ฐจ์ด์ ์œผ๋กœ๋Š” ํ•ญ์ƒ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒˆ Task์—์„œ ๋™์ž‘ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

 

# FLAG_ACTIVITY_SINGLE_TOP

์ผ๋‹จ ์ƒ์„ฑํ•˜๊ณ , ๋งŒ์•ฝ ๋ฐฑ์Šคํƒ์˜ top์ด ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ๋ผ๋ฉด singleTop๊ณผ ๋™์ผํ•œ ์˜ต์…˜์ด๋‹ค.

 

# FLAG_ACTIVITY_CLEAR_TOP

์ด๊ฑด flag๋กœ๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“œ๋‹ค. ์‹คํ–‰ํ•  ์ธ์Šคํ„ด์Šค๊ฐ€ ์ด๋ฏธ Task์— ์กด์žฌํ•œ๋‹ค๋ฉด ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ ์— ๊ทธ ์œ„์—์žˆ๋Š” ๋ชจ๋“  ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ๋‚ ๋ฆฌ๊ณ  onNewIntent๋กœ ๋ผ์šฐํŒ…ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

A-B-C-D๋กœ ์Šคํƒ์— ์Œ“์—ฌ์žˆ๊ณ , ์—ฌ๊ธฐ์„œ B๋ฅผ CLEAR_TOP์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด C-D๋Š” ๋‚ ์•„๊ฐ€๊ฒŒ๋˜๋ฏ€๋กœ A-B๋งŒ ๋‚จ๊ฒŒ๋œ๋‹ค. B๋Š” ์ด๋•Œ onNewIntent๋ฅผ ๋ฐ›๊ฒŒ๋œ๋‹ค. ๊ทผ๋ฐ ๋งŒ์•ฝ ์Šคํƒ top์— ์žˆ๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ CLEAR_TOP์œผ๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด? 

singleTop๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ด๋•Œ๋Š” ๋ถ„๊ธฐ๊ฐ€ ๋‚˜๋‰œ๋‹ค. ํฌ๊ทธ๋ผ์šด๋“œ์— ๋ณด์ด๋Š” ์ค‘์ด๋ผ๋ฉด ํ˜„์žฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋‹ค๊ฐ€ ๋Œ์•„์˜จ๋‹ค๋ฉด ์žฌ์‚ฌ์šฉํ•˜์ง€์•Š๊ณ  ์ œ๊ฑฐํ•œ๋’ค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค. ์ด๊ฒŒ singleTop๊ณผ์˜ ์ฐจ์ด์ ์ด๋‹ค. ํ•ญ์ƒ ์ตœ์ƒ์œ„์— ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ๋‚จ๊ฒจ๋‘˜ ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์žฅ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

๊ทธ๋ž˜์„œ NEW_TASK๋‚˜ SINGLE_TOP๋ž‘ ๊ฐ™์ด ์“ฐ๋Š”๊ฒŒ ํšจ์œจ์ ์ด๋‹ค.

val intent = Intent(this, SubActivity::class.java).apply {
     flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
}

NEW_TASK์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๋‹ค๋ฅธ Task์— ์žˆ์„๋•Œ๋„, ํŠน์ • ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ์ด๋™ํ•˜๋”๋ผ๋„ CLEAR_TOP์†์„ฑ์œผ๋กœ ์ธํ•ด ์Šคํƒ์˜ ์ตœ์ƒ์œ„๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์ƒ๊ธด๋‹ค.(๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์—์„œ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ด์ง„๋‹ค)

val intent = Intent(this, SubActivity::class.java).apply {
     flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
}

์ด๋Ÿฌ๋ฉด ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์—์„œ ์„ค์ •ํ•˜๋Š” launchMode์™€ ๋™์ผํ•ด์ง„๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด ์ด flag๊ฐ€ ์ ์šฉ๋œ ์•กํ‹ฐ๋น„ํ‹ฐ๋ถ€ํ„ฐ, ์Šคํƒ top๊นŒ์ง€ ๋ชจ๋‘ ๋‚ ๋ฆฌ๊ณ  ์ด ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์Šคํƒ์— ์Œ“์•„์„œ ํ•ญ์ƒ top์ด ๋˜๋„๋ก ๋งŒ๋“ ๋‹ค.

 

์ด์ œ ํŠน์ดํ•œ FLAGํ•˜๋‚˜ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณด๊ฒ ๋‹ค.

# FLAG_ACTIVITY_CLEAR_TASK

TASK๋ฅผ ์‹น ๋‚ ๋ฆฌ๋Š” ํ”Œ๋ž˜๊ทธ๋‹ค.  NEW_TASK๋ž‘ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ๋˜๋ฉฐ ํ•ญ์ƒ ์ด์ „ ๋ฐฑ์Šคํƒ์„ ๋‹ค ๋‚ ๋ฆฌ๊ณ  ์ƒˆ TASK๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ๋œ๋‹ค. ์ฆ‰ ํ•ญ์ƒ ๋ฃจํŠธ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

 

https://developer.android.com/guide/components/activities/tasks-and-back-stack?hl=ko

https://developer.android.com/guide/components/intents-filters?hl=ko

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT