Lesson 7: Activity and Fragment Lifecycles

HanbinΒ·2021λ…„ 9μ›” 1일
0

Teach Android Development

λͺ©λ‘ 보기
7/13
post-thumbnail

πŸ’‘ Teach Android Development

κ΅¬κΈ€μ—μ„œ μ œκ³΅ν•˜λŠ” ꡐ윑자료λ₯Ό μ •λ¦¬ν•˜κΈ° μœ„ν•œ ν¬μŠ€νŠΈμž…λ‹ˆλ‹€.

Android Development Resources for Educators

Activity lifecycle

Why it matters

  • μ‚¬μš©μž 데이터 및 μƒνƒœλ₯Ό λ³΄μ‘΄ν•©λ‹ˆλ‹€.
    • μ‚¬μš©μžκ°€ μΌμ‹œμ μœΌλ‘œ 앱을 μ’…λ£Œν–ˆλ‹€κ°€ λ‹€μ‹œ λŒμ•„μ˜΄.
    • μ‚¬μš©μžκ°€ 쀑단됨.(예: 전화톡화)
    • μ‚¬μš©μž κΈ°κΈ° νšŒμ „.
  • λ©”λͺ¨λ¦¬ leaks, μ•± crashes λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

Activity lifecycle

Activity states

onCreate()

  • Activityκ°€ μƒμ„±λ˜κ³  기타 μ΄ˆκΈ°ν™” μž‘μ—…μ΄ μ΄λ€„μ§‘λ‹ˆλ‹€.
  • 이 μ½œλ°±μ€ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • Activity UIλ₯Ό inflate ν•˜κ³  기타 μ‹œμž‘ λ‘œμ§μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

onStart()

  • Activityκ°€ μ‚¬μš©μžμ—κ²Œ ν‘œμ‹œλ©λ‹ˆλ‹€.
  • onCreate(), onRestart()(Activityκ°€ 이전에 μ€‘μ§€λœ 경우) 이후에 ν˜ΈμΆœλ©λ‹ˆλ‹€.

onResume()

  • Activityκ°€ 인풋 포컀슀λ₯Ό μ–»μŠ΅λ‹ˆλ‹€.
    • μ‚¬μš©μžλŠ” Activity와 μƒν˜Έμž‘μš© ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ‹œμŠ€ν…œμ΄ Activityλ₯Ό μΌμ‹œ μ€‘μ§€ν•˜λ„λ‘ μ•ΌκΈ°ν•  λ•ŒκΉŒμ§€ resume μƒνƒœλ‘œ μœ μ§€λ©λ‹ˆλ‹€.

onPause()

  • Activityκ°€ 포컀슀λ₯Ό μžƒμŠ΅λ‹ˆλ‹€. (foregroundκ°€ μ•„λ‹˜)
  • ActivityλŠ” ν‘œμ‹œλ˜κ³  μžˆμ§€λ§Œ, μ‚¬μš©μžκ°€ Activity와 적극적으둜 μƒν˜Έ μž‘μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • onResume()에 λŒ€μ‘λœλ‹€.

onStop()

  • Activityκ°€ 더 이상 μ‚¬μš©μžμ—κ²Œ ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ€ λ¦¬μ†ŒμŠ€λ₯Ό ν•΄μ œν•©λ‹ˆλ‹€.
  • μ‚¬μš©μžκ°€ νŽΈμ§‘ν•˜λ˜ μž‘μ—…μ„ μžƒμ§€ μ•Šλ„λ‘ μ§„ν–‰ν•œ 과정을 μ €μž₯ν•œλ‹€.

onDestory()

  • Activityκ°€ 곧 destory될 μ˜ˆμ •μ΄λ©°, λ‹€μŒκ³Ό 같은 μ›μΈμœΌλ‘œ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ‚¬μš©μžκ°€ Activityλ₯Ό μ’…λ£Œν–ˆκ±°λ‚˜
    • Configuration λ³€κ²½
  • λ¦¬μ†ŒμŠ€μ˜ μ΅œμ’… 정리λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • μ‚¬μš©μžμ˜ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ 이 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€.(더 일찍 μˆ˜ν–‰)

Summary of activity states

Save status

μ‚¬μš©μžλŠ” config λ³€κ²½ ν›„ λ˜λŠ” λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 앱이 μ’…λ£Œλœ 후에도 UI μƒνƒœκ°€ λ™μΌν•˜κ²Œ μœ μ§€λ˜κΈ°λ₯Ό κΈ°λŒ€ν•©λ‹ˆλ‹€.

  • ActivityλŠ” 파괴되고 μž¬μ‹œμž‘λ˜κ±°λ‚˜, 앱이 μ’…λ£Œλ˜κ³  Activityκ°€ μ‹œμž‘λ©λ‹ˆλ‹€.
  • μ•±, Activity Lifecycle 변경사항을 μž¬κ΅¬μ„±ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ‚¬μš©μž 데이터 μ €μž₯:
    • onSaveInstanceState()μ—μ„œ μ œκ³΅ν•˜λŠ” Bundle을 μ‚¬μš©ν•©λ‹ˆλ‹€.
    • onCreate()μ—μ„œ Aciticvtyκ°€ λ‹€μ‹œ 생성될 λ•Œ λ²ˆλ“€μ„ argument둜 λ°›μŠ΅λ‹ˆλ‹€.

Fragment lifecycle

Fragment lifecycle diagram

Fragment states

onAttach()

  • Fragmentκ°€ content에 연결될 λ•Œ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  • onCreate() λ°”λ‘œ 이전

onCreateView()

  • Fragment와 κ΄€λ ¨λœ λ·° 계측을 μƒμ„±ν•˜κΈ° μœ„ν•΄ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  • Fragment λ ˆμ΄μ•„μ›ƒμ„ inflateν•˜κ³  root viewλ₯Ό return ν•©λ‹ˆλ‹€

onViewCreated()

  • λ·° 계측이 μƒμ„±λœ 이후 ν˜ΈμΆœλ©λ‹ˆλ‹€.
  • λ‚˜λ¨Έμ§€ μ΄ˆκΈ°ν™” μž‘μ—…μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.(예: Bundleμ—μ„œ μƒνƒœ 볡원)

onDestroyView() and onDetach()

  • onDestroyView()λŠ” Fragment의 λ·° 계측이 제거될 λ•Œ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  • onDetach()λŠ” Fragmentκ°€ 더 이상 host에 μ—°κ²°λ˜μ§€ μ•Šμ„ λ•Œ ν˜ΈμΆœλ©λ‹ˆλ‹€.

Summary of fragment states

Save fragment state across config changes

Bundle에 μƒνƒœλ₯Ό μ €μž₯ν•˜μ—¬ Fragment의 UI μƒνƒœλ₯Ό λ³΄μ‘΄ν•©λ‹ˆλ‹€.

  • onSaveInstanceState(outState: Bundle)

μ•„λž˜ Fragment μ½œλ°±μ—μ„œ Bundle을 μˆ˜μ‹ ν•˜μ—¬ ν•΄λ‹Ή 데이터λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.

  • onCreate()
  • onCreateView()
  • onViewCreated()

Lifecycle-aware components

Activityλ‚˜ Fragment의 lifecycle에 따라 λ™μž‘ μ‘°μ •.

  • androidx.lifecycle library μ‚¬μš©.
  • 이 것은 Activityλ‚˜ Fragment의 lifecycle μƒνƒœλ₯Ό μΆ”μ ν•©λ‹ˆλ‹€.
    • ν˜„μž¬ lifecycle μƒνƒœ μœ μ§€.
    • lifecycle 이벀트λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.(μƒνƒœμ˜ 변경이 μΌμ–΄λ‚œ 경우)

LifecycleOwner

  • ν•΄λ‹Ή ν΄λž˜μŠ€μ— lifecycle이 μžˆλ‹€λŠ” Interface μž…λ‹ˆλ‹€.
  • κ΅¬ν˜„μžλŠ” getLifecycle() λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Example: Fragment 및 AppCompatActivityλŠ” LifecycleOwnerκ°€ implements λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

LifecycleObserver

lifecycle 이벀트λ₯Ό μˆ˜μ‹ ν•˜λ €λŠ” ν΄λž˜μŠ€μ— LifecycleObserver μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.

class MyObserver : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connectListener() {
        ...
    }

lifecycle에 observerλ₯Ό μΆ”κ°€ν•¨μœΌλ‘œμ„œ 이벀트λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

myLifecycleOwner.getLifecycle().addObserver(MyObserver())

More about Activity and Fragment lifecycle

More about Activity lifecycle

ListActivityμ—μ„œ DetailActivity둜 이동할 경우 lifecycle 호좜 μˆœμ„œλ₯Ό μ•Œμ•„λ΄…λ‹ˆλ‹€.

Lifecycle event, ListActivity -> DetailActivity

  1. [List] onPause
  2. [Detail] onCreate
  3. [Detail] onStart
  4. [Detail] onResume
  5. [List] onStop

DetailActivityμ—μ„œ ListActivity둜 λŒμ•„μ˜¬ 경우 lifecycle 호좜 μˆœμ„œλ₯Ό μ•Œμ•„λ΄…λ‹ˆλ‹€.

Lifecycle event, DetailActivity -> ListActivity

  1. [Detail] onPause
  2. [List] onReStart
  3. [List] onStart
  4. [List] onResume
  5. [Detail] onStop
  6. [Detail] onDestroy

More about Fragment lifecycle

ListFragmentμ—μ„œ DetailFragment둜 이동할 경우 lifecycle 호좜 μˆœμ„œλ₯Ό μ•Œμ•„λ΄…λ‹ˆλ‹€.

Lifecycle event, ListActivity -> DetailActivity

  1. [List] onPause
  2. [List] onStop
  3. [Detail] onAttach
  4. [Detail] onCreate
  5. [Detail] onCreateView
  6. [Detail] onViewCreated
  7. [Detail] onStart
  8. [List] onDestroyView
  9. [Detail] onResume

DetailFragmentμ—μ„œ ListFragment둜 λŒμ•„μ˜¬ 경우 lifecycle 호좜 μˆœμ„œλ₯Ό μ•Œμ•„λ΄…λ‹ˆλ‹€.

Lifecycle event, DetailActivity -> ListActivity

  1. [Detail] onPause
  2. [Detail] onStop
  3. [List] onCreateView
  4. [List] onViewCreated
  5. [List] onStart
  6. [Detail] onDestroyView
  7. [Detail] onDestroy
  8. [Detail] onDetach
  9. [List] onResume

0개의 λŒ“κΈ€