Udacity ์์ Developing Android Apps with Kotlin ์ด๋ผ๋ ๊ฐ์๋ฅผ ๋ฃ๊ณ lesson ๋ณ๋ก ์ค์ํ๋ค๊ณ ์๊ฐํ ๋ถ๋ถ์ ํ๊ธฐํ ๋ด์ฉ์ด๋ค.
์์ด ๊ฐ์๋ฅผ ๋ฃ๊ณ ํ๊ธฐํ ๋ด์ฉ์ด๋ค ๋ณด๋ ๋ฒ์ญ์ด๋ ํด์์ด ์๋ชป๋ ๋ถ๋ถ์ด ์์ ์ ์๋ค. ๋ ์ผ๋ถ๋ ์์ด ๋จ์ด๋ ๋ฌธ์ฅ์ ๊ทธ๋๋ก ์ ์ด๋์๋ค.
์ ํํ ๋ด์ฉ์ ๊ฐ์๋ฅผ ์ง์ ์ฐธ๊ณ ํ๋ ๊ฒ์ ๊ถํ๋ค.
2. Why Track Activity State?
๋ชจ๋ activity์ fragment๋ lifecycle์ด ์กด์ฌํ๋ค. activity lifecycle์ activity๊ฐ ๊ฑฐ์น๋ ๋ค๋ฅธ ์ํ๋ค๋ก ๊ตฌ์ฑ๋์ด ์๋๋ฐ ์ฒ์ ์ด๊ธฐํ๋ถํฐ destroy๋ ๋๊น์ง ์ด๋ค. ์ฌ์ฉ์๊ฐ ํฐ์ ์ฌ์ฉํ ๋ ์ฑ์ด ์ ๋์ํ๊ณ ๋ถ๋๋ฝ๊ฒ ๋ ๋๋๋ ๊ฒ์ด ์ค์ํ๋ค. activity๋ค๊ณผ fragment๋ค์ ์ ํ๋ OS์ ์์๋ค์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉ์งํจ์ผ๋ก ๊ทธ๋ ๊ฒ ํ ์ ์๋ค.
์๋๋ก์ด๋ OS๋ ๋ฐฐํฐ๋ฆฌ์ ์ฑ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด์ activity์ state๋ฅผ ๊ด์ฐฐํ๋ค. ๊ทธ๋์ OS๋ ๋๋๋ก behind the scenes์์ ์ฑ์ ์ค์ง์ํค๊ฑฐ๋ ์ฌ์์ํ๋ค. ๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ์ proactive, defensiveํด์ผํ๋ค.
- proactive(์ฌ์ ์ ๋์ฒํ๋): clean up unused resources => onscreen activity๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋์ํ๊ฒ ํ๋ค.
- defensive(๋ฐฉ์ด์ ๋์์ด ๋๋): OS๊ฐ ์ฑ์ ์ฌ์์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋์์ ๋์.
์ด๋ ๊ฒ ๋ชจ๋ ๊ฒ์ handling ํ๋ ค๋ฉด knowing exactly what's going on behind the scenes with activity state and the Android OS ๊ฒ์ด ํ์ํ๋ค.
3. Exercise: Introduction to the Activity Lifecycle Diagram
์ด๋ฆ์ด ๊ฐ๋ฆฌํค๋ ๊ฒ์ฒ๋ผ ์์ states๋ activity์ ์ํ๋ฅผ ๋ํ๋.
์ด ๋ฉ์๋๋ค์ activity๊ฐ ํ ์ํ์์ ๋ค๋ฅธ ์ํ๋ก ์ด๋ํ ๋ ํธ์ถ๋๋ค.
์ธ์ ์ด ๋ฉ์๋๋ค์ด ํธ์ถ๋๋์ง, ๊ฐ ์ฝ๋ฐฑ์ด ๋ฌด์์ ํ๋์ง๋ฅผ ์๋ ๊ฒ์ ์ค์ํ๋ค.
4. Exercise: Introduction to Logging
5. Exercise: The Application Class and Timber
Timber: Logging ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Timber์ ์ด์
- tags๋ฅผ ์์ฑํด์ค.
- ์ฑ ๋ฐฐํฌ์์ apk์ log๊ฐ ํฌํจ๋๋ ๊ฒ์ ๋ฐฉ์งํจ.
- ํฌ๋์ ๋ฆฌํฌํธ์์ ํตํฉ์ด ์ฌ์.
Application Class๋ ์ ์ฒด ์ฑ์ ๋ํ global application state๋ฅผ ๊ฐ๊ณ ์๋ ๋ฒ ์ด์ค ํด๋์ค๋ก OS๊ฐ ์ฑ๊ณผ ์ํธ์์ฉํ๊ธฐ ์ํ main object์ด๊ธฐ๋ ํ๋ค. OS์์ ์ฌ์ฉํ๋ default apllication class๊ฐ ์์ง๋ง subclass๋ก ํน์ setup๋ ๊ฐ๋ฅํ๋ค.
6. Lifecycle: Open and Close
onDestory์ ๊ฒฝ์ฐ activity๊ฐ ์์ ํ shutdown ๋์๊ณ garbage collect(๋ ์ด์ ์ฌ์ฉํ์ง ์๋ object๋ค์ ์๋์ผ๋ก cleanup ํ๋ ๊ฒ) ๋ ์ ์๋ค๋ ๊ฒ.
7. Lifecycle: Share dialog
onStart: onStart is called when the activity becomes visible
onResume: OnResume is called when the activity has *focus
onPause: onPause is called when the activity loses focus.
onStop: onStop is called when the activity goes off screen
*Having focus is when you actually interact with the activity
8. onCreate vs. onStart
onPause, onStop, onDestroy๊ฐ ํธ์ถ๋๋ฉด ๊ฐ๋ฐ์๊ฐ ๋ญ๊ฐ๋ฅผ cleanup ํด์ผํ๋ค๋ ์ ํธ. (cleanup resources)
onStart, onResume, onCreate๊ฐ ํธ์ถ๋๋ฉด ํ์ํ resources๋ค์ ๋ค์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์. (setup resources)
12. Exercise: Setup and Teardown
๋ง์ฝ resource๋ฅผ setup ํ๋ค๋ฉด, ๊ธฐ์ตํ๋ค๊ฐ ํด์ฒด/ํ๊ดด(teardown) ํ๋ ๊ฒ์ ์์ด๋ฒ๋ ค์๋ ์๋๋ค.
setup/tear down์ ๋์ํ๋/mirrored method์์ ์งํํด์ผํ๋ค. e.g.) onStart <-> onStop, onCreate <-> onDestroy
13. Introduction to the Lifecycle Library
์๋ง์ ๊ฒ๋ค์ onCreate / onStart์์ setupํ๊ณ onDestroy / onStop์์ tear down ํด์ผํ๋๋ฐ ํ๋๋ผ๋ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ๋ฒ๊ทธ๋ก ์ด์ด์ง๊ฑฐ๋ ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ ๋๊ธฐ ์ญ์์ด๋ค.
๋ง์ผ ์์์ ์ ๋์ start / stop ํ ์ ์๋ค๋ฉด ์ผ๋ง๋ ์ข์๊น?
๊ทธ๋์ 2017๋
๊ตฌ๊ธ์์๋ Lifecycle library๋ฅผ ์๊ฐํ๋ค.
๋ชฉํ๋ activitiy์ fragment์ Lifecycle์ ๋จ์ํํ์ฌ ์์
ํ๊ธฐ ์ํจ์ด๋ค.
Lifecycle library ์ด์ ์๋ fragment์ activity lifecycle๊ณผ interactํ ์ ์๋ ๋ฐฉ๋ฒ์ callback์ ์ด์ฉํ๋ ๊ฒ์ด์๋๋ฐ, lifecycle library๋ ์ค์ object๋ฅผ ๋์ ํ์๋ค. ์ด object๋ฅผ ์ฌ์ฉํ์ฌ queryํ๊ฑฐ๋ state๋ฅผ ํ์ธํ ์ ์๋ค.
LifecycleOwner์ LifecycleObserver interface๋ฅผ ์๊ฐํ์๋๋ฐ LifecycleOwner is a class that has a Lifecycle(Fragment & Activitiy). LifecycleObserver๋ object๊ฐ LifecycleOwner๋ฅผ ๊ด์ฐฐํ ์ ์๊ฒ ํด์ค๋ค.
14. Exercise: Lifecycle Observation
callback์ ์ฌ์ฉํ ๋๋ MainActivity๊ฐ timer๋ฅผ ์์ํ ๊ฒ์ธ์ง ๋ฉ์ถ ๊ฒ์ธ์ง ๊ด์ฌํ์ง๋ง observer๋ฅผ ์ฌ์ฉํ๋ฉด ๊ด๊ณ๊ฐ ๋ค๋ฐ๋๋ค. (์์ ์ฑ์ ํ์ด๋จธ ๊ธฐ๋ฅ์ด ์์.) Timer๊ฐ activity์ observer๊ฐ ๋๋ค. activity์ state๊ฐ ๋ณํ๋ฉด Timer๋ ์๋ฆผ์ ๋ฐ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ state๊ฐ ๋ฐ๋ ๊ฒ์ ๋ํด ๋ฌด์์ ํ ๊ฒ์ธ๊ฐ๋ Timer์ ์ฑ ์์ด๋ค. ์์ ์ ๊ฒฝ์ฐ ์ค์ค๋ก start ํ ๊ฒ์ธ์ง stop ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ค.
์ฆ Timer๊ฐ MainActivity๋ฅผ observeํ๊ณ MainActivity์ ์ํ์ ๋ฐ๋ผ ์์ ์ด ๋ฌด์์ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
15. Process Shutdown
์๋๋ก์ด๋ ๊ธฐ๊ธฐ์์ ์ ๊น ์ฑ์ ๋ ๋ฌ๋ค๊ฐ ๋์์จ๋ค๊ณ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง์ง ์์ง๋ง ์๋๋ก์ด๋ OS์ ์ฃผ๋ ๊ด์ฌ์ฌ, ์ค์ํ ๋ฌธ์ ์ค ํ๋๋ foreground์ activity๋ฅผ smoothํ๊ฒ ๋์์ํค๋ ๊ฒ์ด๋ค. OS๋ foreground์ ์ฑ์ issue ์์ด ๋์ํ๊ฒ ํ๊ธฐ ์ํด Background์ ์ฑ์ regulateํ๋ค. ์ฌ๊ธฐ์๋ ๋์ํ๋ app์ ์ซ์๋ฅผ ์ ํํ๋ ๊ฒ๋ ํฌํจ๋๋ค. ํน์ ์ํฉ์์๋ ์ ์ฒด ์ฑ์ ํ๋ก์ธ์ค๋ฅผ shutdown์ํจ๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ์ฉ์๊ฐ ์ฑ์ด shutdown๋ ๊ฒ์ ์์์ฑ๋ค๋ฉด ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ด ์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ค์ app์ผ๋ก ์ด๋ํ๋ฉด ์ฑ์ ๋ค์ ์ฌ์์ํด์ค๋ค. OS๋ ์๋์ผ๋ก ์ผ๋ถ UI์ ๋ณด๋ค์ ํ๋ก์ธ์ค๊ฐ ์ฌ์์ฑ๋์์ ๋๋ฅผ ์ํด์ ์ ์ฅํด๋๋ค. acitivity์ ์ ํํ ์ด์ ์ํ๋ฅผ ๋ณต๊ตฌํ๋๋ฐ์๋ ๋๊ฐ ๊ฐ๋ฐ์์ ์์ ์ด ํ์ํ๋ค.
16. Process Shutdown
์๋๋ก์ด๋ OS๋ ์ฑ์ ์ฌ์์ํ ๋ ์ด์ ์ํ ๊ทธ๋๋ก ๋ณต์ํ๊ธฐ ์ํด ์ต์ ์ ๋คํ๋ค. OS๋ activity์์ navigate awayํ ๋ ์ผ๋ถ views์ ์ ๋ณด๋ฅผ Bundle(key:value pair๋ก ์ ์ฅ)์ ์ ์ฅํ๋ค. ์๋ฅผ ๋ค๋ฉด ID set์ด ๋ค์ด์๋ EDIT TEXT์ ๊ฒฝ์ฐ ์๋ ์ ์ฅ๋๋ค. ๋ backstack๋ ์ ์ฅํด์ค๋ค. ๊ทธ๋ฐ๋ฐ OS๊ฐ activity์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ๋ ์๋ค. custom variable๊ฐ์ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ฌํ๋ค. ๊ทธ๋์ ์ด ๊ฒฝ์ฐ manually add the data to the bundle yourself๊ฐ ํ์ํ๋ค.
17. Exercise: onSaveInstanceState
onSaveInstanceState๋ OS๊ฐ app์ destroyํ ๊ฒฝ์ฐ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ callback์ด๋ค. onStop ๋ค์ ํธ์ถ๋๋ค. System์ ์ด bundle์ RAM์ ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ bundle๋ด์ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๊ฒ์ด ์ข๋ค. Bundle์ ํฌ๊ธฐ๋ ์ ํ๋์ด ์๋ค. 100kb์๋๋ก ์ ์ฅํด์ผํ๋ค. ์ด๊ฒ์ ๋์ด๊ฐ๋ฉด ์ฑ์ด transactionTooLargeException์ผ๋ก crash๋ ์ํ์ด ๋์์ง๋ค.
- ์ฑ์ด ์ฒ์ ์คํ๋๋ค๋ฉด onCreate(saveInstanceBundle: Bundle?)์์ saveInstanceBundle์ด null์ผ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ != null์ ํตํด ์ฒ์ ์คํ๋ ๊ฒ์ธ์ง recreating ๋ ๊ฒ์ธ์ง๋ฅผ ๋ถ๋ณํ ์ ์๋ค.
- onRestoreInstanceState๋ savedInstanceBundle๊ณผ ํจ๊ป ํธ์ถ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ณดํต onCreate์์ activity state๋ฅผ ๋ณต์ํ๋ค. ์๋ํ๋ฉด onRestoreInstanceState๋ onStart ํ์ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ด๋ค. ํ๋จ์ Lifecycle ์ ๋ฆฌ ๋ํ ์ฐธ์กฐ.
18. Configuration Changes
Rotate screen is considered a configuration change. Configuration change is a major change a device undergoes that causes the activity to be rebuilt.
์ฌ๊ธฐ์๋ ์ฌ์์๊ฐ ๊ธฐ๊ธฐ์ ์ธ์ด๋ฅผ ๋ฐ๊พธ๋ ๊ฒ, ๋ฌผ๋ฆฌ์ ํค๋ณด๋์ ์ฐ๊ฒฐํ๋ ๊ฒ, ๊ธฐ๊ธฐ์ ๋ฐฉํฅ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ํฌํจ๋๋ค.
onSaveInstanceState()์์ super method ํธ์ถํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฅ๋๋๋ก ์ฒ๋ฆฌ๋๋ ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋์ง ์์ ๋์ค์ ๋ณต๊ตฌ๋์ง ์์ ์ ์๋ค.
Lifecycle ์ ๋ฆฌ ๋ํ
'Android & Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Lesson 5: App Architecture(UI Layer) (0) | 2022.02.22 |
---|---|
๊ณต๋ถ ์ฃผ์ (0) | 2022.02.19 |
Lesson 3: App Navigation (0) | 2022.02.08 |
Lesson 2: Layouts (0) | 2022.02.06 |
Lesson 1: Build your First App (0) | 2022.02.06 |