[Android] Activity Lifecycle ์ •๋ฆฌ

Minjun Kimยท2023๋…„ 8์›” 30์ผ
0

Android

๋ชฉ๋ก ๋ณด๊ธฐ
27/47
post-thumbnail

๐Ÿ“ SeSAC์˜ 'JetPack๊ณผ Kotlin์„ ํ™œ์šฉํ•œ Android App ๊ฐœ๋ฐœ' ๊ฐ•์ขŒ๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.


๐Ÿ“š Activity Lifecycle

์‹œ์Šคํ…œ์—์„œ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

  • ํ™œ์„ฑ ์ƒํƒœ : ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ํ™”๋ฉด์ด ์ถœ๋ ฅ๋˜๊ณ  ์žˆ๊ณ  ์œ ์ €๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ

  • ์ผ์‹œ์ •์ง€ ์ƒํƒœ : ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ํ™”๋ฉด์ด ์ถœ๋ ฅ๋˜๊ณ  ์žˆ์ง€๋งŒ ์œ ์ €๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์—†๋Š” ์ƒํƒœ

  • ๋น„ํ™œ์„ฑ ์ƒํƒœ : ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ํ™”๋ฉด์ด ์ถœ๋ ฅ๋˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ์ƒํƒœ

๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํ™œ์„ฑ ์ƒํƒœ๋Š” ํ™”๋ฉด์ด ๋ณด์ด๊ณ  ์žˆ๊ณ  ํ„ฐ์น˜ ๊ฐ€๋Šฅ

์ผ์‹œ์ •์ง€ ์ƒํƒœ๋Š” ํ™”๋ฉด์€ ๋ณด์ด์ง€๋งŒ ํ„ฐ์น˜ ๋ถˆ๊ฐ€๋Šฅ (paused)

๋น„ํ™œ์„ฑ ์ƒํƒœ๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ํ™”๋ฉด์ด ์ „ํ˜€ ๋ณด์ด์ง€ ์•Š๋Š” ์ƒํƒœ (stop)

๐Ÿ“Œ ํ™œ์„ฑ ์ƒํƒœ

์ธํ…ํŠธ๋กœ ์•ฑ์ด ์‹คํ–‰๋˜๋ฉด ์‹œ์Šคํ…œ์€ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์šฐ์„  ํ™œ์„ฑ ์‹ฑํƒœ ๋กœ ๋งŒ๋“ ๋‹ค.

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

onCreate() , onStart() , onResume() ํ•จ์ˆ˜๊ฐ€ ์ž๋™ ์ฝœ ๋˜๋ฉด์„œ ํ™œ์„ฑ ์ƒํƒœ ๊ฐ€ ๋œ๋‹ค.

๋ฌผ๋ก  ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ„ 3๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ํ•„์š”๋Š” ์—†๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์ฃผ๋กœ onCreate() ์—์„œ setContentView ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. onCreate() ๋Š” ์ตœ์ดˆ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์€ ์ตœ์ดˆ ํ•œ ๋ฒˆ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ ํ›„์—๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝํ•ด ๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

๋ฌผ๋ก  onStart() ์™€ onResume() ์—์„œ setContentView ๋ฅผ ํ˜ธ์ถœํ•ด๋„ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋‘˜์€ ๋ฐ˜๋ณต ํ˜ธ์ถœ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์–ด ๋ถ€์ ํ•ฉํžˆ๋‹ค.

๐Ÿ“Œ ์ผ์‹œ์ •์ง€ ์ƒํƒœ

ํ™œ์„ฑ ์ƒํƒœ์—์„œ onPause() ๋ผ๋Š” ํ•จ์ˆ˜๊นŒ์ง€ ํ˜ธ์ถœ๋œ ์ƒํƒœ๊ฐ€ ์ผ์‹œ์ •์ง€ ์ƒํƒœ์ด๋‹ค. ํ™”๋ฉด์€ ์ถœ๋ ฅ๋˜์ง€๋งŒ ์œ ์ € ์ด๋ฒคํŠธ๋Š” ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋‹ค ๋‹ค์‹œ ํ™œ์„ฑ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•ด onResume() ์„ ํ˜ธ์ถœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ onResume() ์€ ๋ฐ˜๋ณต ํ˜ธ์ถœ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€๋กœ, ๊ฐค๋Ÿฌ๋ฆฌ์™€ ์นด์นด์˜คํ†ก์„ ๋ถ„ํ•  ํ™”๋ฉด์œผ๋กœ ๋™์‹œ์— ๋„์šด ๊ฒฝ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ฐค๋Ÿฌ๋ฆฌ๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๋ฉด 'ํ™œ์„ฑ ์ƒํƒœ', onResume() ๊นŒ์ง€ ํ˜ธ์ถœ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์นด์นด์˜คํ†ก์„ ๋ถ„ํ• ๋กœ ๋„์šฐ๋Š” ์ˆœ๊ฐ„ ํฌ์ปค์Šค๊ฐ€ ๊ฐค๋Ÿฌ๋ฆฌ์—์„œ ์นด์นด์˜คํ†ก์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐค๋Ÿฌ๋ฆฌ๋Š” '์ผ์‹œ์ •์ง€ ์ƒํƒœ',onPause() ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์นด์นด์˜คํ†ก์€ onResume() ๊นŒ์ง€ ํ˜ธ์ถœ๋œ๋‹ค. ํฌ์ปค์Šค๋ฅผ ๋‹ค์‹œ ๊ฐค๋Ÿฌ๋ฆฌ์— ์ฐ์œผ๋ฉด ํ™œ์„ฑ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

๐Ÿ“Œ ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ

ํ™œ์„ฑ ์ƒํƒœ์˜ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ๊ฐ€ ๋˜๋ฉด onPause() ๋ฅผ ๊ฑฐ์ณ onStop() ๊นŒ์ง€ ํ˜ธ์ถœ๋œ ์ƒํƒœ์ด๋‹ค. ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ๋ผ๊ณ  ๋งํ•˜์ง€๋งŒ, ์•„์ง ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋‹จ์ง€ ํ™”๋ฉด๋งŒ ์ถœ๋ ฅ๋˜์ง€ ์•Š์„ ๋ฟ ์—ฌ์ „ํžˆ ๊ฐ์ฒด๋Š” ์‚ด์•„์žˆ๋‹ค.

A ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ์ธํ…ํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ B ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ํ™”๋ฉด ์ „ํ™˜์ด ์ด๋ฃจ์–ด์กŒ์„ ๋•Œ, A ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” onStop() ๊นŒ์ง€ ํ˜ธ์ถœ๋œ๋‹ค. ๋ฌผ๋ก  A ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ๊ฐ์ฒด๋Š” ์†Œ๋ฉธํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ A ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ๊ฒฝ์šฐ onRestart() ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ onStart() ์™€ onResume() ๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ํ˜ธ์ถœ๋œ๋‹ค.


๐Ÿ“š Save Instance

ํ”ํžˆ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ์ƒํƒœ ์ €์žฅ ๊ธฐ๋ฒ• ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  • ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ์‚ฌ๋ผ์ง„๋‹ค.

  • ๋‹ค์‹œ ์‹คํ–‰ ์‹œ ๋ณต์› ์‹œ์ผœ์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ƒํƒœ ์ €์žฅ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ด๋Ÿฐ ์˜๋ฌธ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

"๊ทธ๋ƒฅ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰ ๋  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋Œ์–ด์˜ค๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋‹ˆ๋ƒ?"

์ž ๊น๋งŒ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋‹ด๋Š” ๊ฒƒ์€ ์•Œ๋งž์ง€ ์•Š๋‹ค. ์•„์ฃผ ์ž ๊น ์‚ฌ๋ผ์กŒ๋‹ค๊ฐ€ ๋ณต์›๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ๊ฒƒ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๊ณผ๋„ํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์ฆ‰, ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ํฌ๋‹ค.

๊ทธ๋Ÿด ๋•Œ ์ƒํƒœ ์ €์žฅ ๊ธฐ๋ฒ• ์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„์ฃผ ๋”ฑ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ“ ์ƒํƒœ ์ €์žฅ ์˜ˆ์‹œ

๊ทธ๋Ÿผ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ฒฝ์šฐ์— ์ด์šฉ์„ ํ• ๊นŒ?

๋ฐ”๋กœ ํ™”๋ฉด ํšŒ์ „ ์ด๋‹ค.

  • onResume() ๊นŒ์ง€ ํ˜ธ์ถœ๋œ 'ํ™œ์„ฑ ์ƒํƒœ' ์—์„œ ํ™”๋ฉด ํšŒ์ „์„ ํ•œ ์ˆœ๊ฐ„ onDestroy() ๊นŒ์ง€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ์ข…๋ฃŒ ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ณง๋ฐ”๋กœ ๋‹ค์‹œ onResume() ๊นŒ์ง€ ํ˜ธ์ถœ๋˜์–ด 'ํ™œ์„ฑ ์ƒํƒœ' ๊ฐ€ ๋œ๋‹ค.

  • ์ด ๊ฒฝ์šฐ ํ•ด๋‹น ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์†Œ๋ฉธ๋œ๋‹ค.
    ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ ์†Œ๋ฉธ์„ ์›์น˜ ์•Š์„ ๊ฒฝ์šฐ์—, ์ด๋ฅผ ์ƒํƒœ ์ €์žฅ ์œผ๋กœ ์ปค๋ฒ„์น  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

override fun onCreate(savedInstanceState: Bundle?) {
	super.onCreate(savedInstanceState)
	setContentView(R.layout.activity_main)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
	super.onRestoreInstanceState(savedInstanceState)
}

override fun onSaveInstanceState(outState: Bundle) {
	super.onSaveInstanceState(outState)
}
  • onCreate() , onSaveInstanceState() , onRestoreInstanceState() ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜

  • ์œ„ 3๊ฐœ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์ด ๋ชจ๋‘ Bundle ์ด๋‹ค. ์ด๊ฑธ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

  • Bundle ์€ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์œ ๋ช…ํ•œ ํด๋ž˜์Šค๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ Map ๊ฐ์ฒด ์ •๋„๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
    ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ K-V ์Œ์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

  • onSaveInstanceState() ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๊ณง ํ•ด๋‹น ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ข…๋ฃŒ๋จ์„ ์˜๋ฏธํ•œ๋‹ค.
    ๊ทธ๋ž˜์„œ onSaveInstanceState() ์—์„œ ์ €์žฅ๋  ๋ฐ์ดํ„ฐ๋ฅผ Bundle์— ๋‹ด์•„์ฃผ๋ฉด ๋œ๋‹ค.

  • ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์‹คํ–‰ ๋˜์—ˆ์„ ๋•Œ, onCreate() ํ˜น์€ onSaveInstanceState() ์—์„œ Bundle๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•˜๋ฉด ๋œ๋‹ค.

โ“ ๊ทผ๋ฐ ์™œ onCreate() ๊นŒ์ง€ Bundle์„ ์ œ๊ณตํ•˜๋Š” ๊ฑธ๊นŒ?

๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ UI ๊ตฌ์„ฑ์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ“Œ Bundle

์ƒํƒœ ๋ฐ์ดํ„ฐ ์ €์žฅ

outState.putString("data1", "hello")
outState.putInt("data2", 10)
  • Bundle ์— ๋ฐ์ดํ„ฐ ์ €์žฅ์€ putString(), putInt() ๋“ฑ์˜ ํ•จ์ˆ˜๋ฅผ ์ด์šฉ

์ƒํƒœ ๋ฐ์ดํ„ฐ ํš๋“

count = saveInstanceState.getInt("count")
  • Bundle ๊ฐ์ฒด์—์„œ ๋ฐ์ดํ„ฐ ํš๋“์€ getter() ํ•จ์ˆ˜๋ฅผ ์ด์šฉ

  • ํ‚ค๊ฐ’๋งŒ ๋ช…์‹œํ•˜๋ฉด ๋œ๋‹ค.


๐Ÿงฉ ์‹ค์Šต ์˜ˆ์ œ

  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_cnt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="30dp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_plus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="plus" />

    <EditText
        android:id="@+id/et_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp" />

</LinearLayout>

  • MainActivity.kt
package com.kotdev99.android.c45

class MainActivity : AppCompatActivity() {

	private var cnt = 0
	private lateinit var editView: EditText
	private lateinit var cntView: TextView

	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(R.layout.activity_main)

		cntView = findViewById(R.id.tv_cnt)
		val btn = findViewById<Button>(R.id.btn_plus)
		editView = findViewById(R.id.et_edit)

		btn.setOnClickListener {
			cnt++
			cntView.text = "$cnt"
		}
	}

	override fun onSaveInstanceState(outState: Bundle) {
		super.onSaveInstanceState(outState)
		outState.putInt("cnt", cnt)
		outState.putString("edit", editView.text.toString())
	}

	override fun onRestoreInstanceState(savedInstanceState: Bundle) {
		super.onRestoreInstanceState(savedInstanceState)
		cnt = savedInstanceState.getInt("cnt")
		cntView.setText("$cnt")
		editView.setText(savedInstanceState.getString("edit"))
	}
}

๐Ÿ“ฒ ๊ฒฐ๊ณผ

profile
์‘์•  ๋‚˜ ์•„๊ธฐ ๋‰ด๋น„

0๊ฐœ์˜ ๋Œ“๊ธ€