반응형

2023.03.14 - [Development/Android] - [Android/안드로이드] 안드로이드 생명 주기(라이프사이클 Life Cycle)

 

[Android/안드로이드] 안드로이드 생명 주기(라이프사이클 Life Cycle)

지금 생각해 보면 정말 기본적인 거지만 한참 공부를 시작했을 때 대수롭지 않게 여겼던 것이 라이프사이클이다. 실습용 앱을 만들면서도 어지간한 기능들은 전부 'onCreate()'선에서 실행시켰었

solution94.tistory.com

이전에 '액티비티 라이프사이클'에 이어 '프래그먼트 라이프사이클'에 알아보았다.

 

안드로이드 공식 레퍼런스에서 프래그먼트 라이프사이클에 대해 알아보던 중 다른 개발자분들의 글을 보니 콜백 메서드가 부분적으로 다르다는 걸 알았다. 당연히 공식 레퍼런스 페이지가 맞겠거니 하고 알아보고 있었는데 오히려 다른 개발자분들이 올려놓은 이미지 자료가 맞는 자료였다.

찾다 보니 공식 레퍼런스에서 소개하는 프래그먼트 라이프사이클 내용은 2020년 3월 18일 업데이트 이후 부분적으로 deprecated 되고 새로운 콜백 메서드가 추가되었더라. 액티비티의 생명 주기와 프래그먼트 생명 주기가 서로 영향을 덜 받게 하기 위해 업데이트했다고 하더라. 다들 동일한 이미지 자료와 여러 캡처된 텍스트 설명들을 보면 어딘가에 공식적으로 존재하긴 하는 것 같은데 도저히 못 찾겠다...

대체 왜 공식 레퍼런스에선 deprecated된 자료가 그대로 버젓이 쓰고 있는지는 모르겠다... 혹시나 싶어서 직접 안드로이드 스튜디오에서 deprecated 됐다는 콜백 메서드를 입력해 보니 deprecated라고 뜨긴 한다...


액티비티 생명 주기와 다른가?

프래그먼트 생명 주기는 액티비티처럼 존재하지만 항상 액티비티 내에서 호스팅되어야 하기 때문에 호스트 액티비티의 라이프사이클에 직접적으로 영향을 받는다. 호스트 액티비티가 일시정지되거나 소멸할 경우 호스팅 된 프래그먼트 또한 일시정지 혹은 소멸되는 식이다.

 

프래그먼트 생명 주기는 어떻게 생겼지?

프래그먼트 생명 주기

중간 중간 'View'와 'State' 키워드가 들어가는 콜백 메서드들을 제외하면 액티비티 생명 주기와 유사한 형태를 띠고 있다.

 

이제 생명 주기가 어떻게 생겼는지는 알겠고 각 콜백 메서드마다 언제 실행되고 어떤 일을 하는지 정리하면 되는데 이게 정말 어려웠다. 프래그먼트를 사용한 포트폴리오를 진행해보질 않아서 읽기만 하고 이해하기가 힘들었다... 그래서 조금 있다가 다루겠지만 onAttach()처럼 생명 주기에는 나와있지 않은 콜백 메서드들의 deprecated 여부도 궁금했기에 간단한 예시와 함께 진행했다.

 

보기만 해선 이해가 안된다. 직접 해보면서 봐야겠다.

MainActivity에 FragmentContainerView를 위치시키고, 'SWITCH' 버튼을 클릭하면 각 프래그먼트 A와 B를 Replace 시키고 'REMOVE' 버튼을 클릭하면 remove 시키는 테스트 프로젝트 작성했다.

https://juahnpop.tistory.com/224

 

안드로이드 코틀린 : Fragment 추가, 변경, 삭제 사용법 및 유의점

Android Kotlin : Activity에 Fragmeent 추가, 변경, 삭제 및 고려사항 정리 안드로이드 개발자 가이드에서는 (다양한 이유로) 다수의 화면을 포함하는 앱은 다수의 Activity가 아닌 Fragment 사용하길 권장합니

juahnpop.tistory.com

이는 해당 게시글을 참고했다.

 

MainActivity

모든 생명 주기를 각 프래그먼트 클래스 안에서 콜백 메서드가 호출될 때 로그가 찍히도록 만들어 빌드했다. 처음에는 MainActivity FragmentContainerView에 아무런 프래그먼트가 들어있지 않은 상태이기 때문에 아무런 로그도 찍히지 않는다.

 

SWITCH 클릭으로 프래그먼트A를 add

2023-03-20 22:18:53.298 10679-10679/com.solution.myapplication D/myLog: BlankFragmentA : onAttach
2023-03-20 22:18:53.299 10679-10679/com.solution.myapplication D/myLog: BlankFragmentA : onCreated
2023-03-20 22:18:53.299 10679-10679/com.solution.myapplication D/myLog: BlankFragmentA : onCreadtedView
2023-03-20 22:18:53.306 10679-10679/com.solution.myapplication D/myLog: BlankFragmentA : onViewCreated
2023-03-20 22:18:53.308 10679-10679/com.solution.myapplication D/myLog: BlankFragmentA : onViewStateRestored
2023-03-20 22:18:53.309 10679-10679/com.solution.myapplication D/myLog: BlankFragmentA : onStart
2023-03-20 22:18:53.311 10679-10679/com.solution.myapplication D/myLog: BlankFragmentA : onResume

일단 생명 주기 레퍼런스 이미지에서는 나와있지 않은 onAttach() 콜백 메서드가 deprecated 되지 않았고 정상적으로 호출되는 걸 확인할 수 있었다.

 

SWITCH 클릭으로 프래스먼트B를 replace

2023-03-20 22:26:54.097 10679-10679/com.solution.myapplication D/myLog: BlanFragmentA : onPause
2023-03-20 22:26:54.097 10679-10679/com.solution.myapplication D/myLog: BlanFragmentA : onStop
2023-03-20 22:26:54.097 10679-10679/com.solution.myapplication D/myLog: BlanFragmentB : onAttach
2023-03-20 22:26:54.097 10679-10679/com.solution.myapplication D/myLog: BlanFragmentB : onCreated
2023-03-20 22:26:54.097 10679-10679/com.solution.myapplication D/myLog: BlanFragmentB : onCreadtedView
2023-03-20 22:26:54.102 10679-10679/com.solution.myapplication D/myLog: BlanFragmentB : onViewCreated
2023-03-20 22:26:54.103 10679-10679/com.solution.myapplication D/myLog: BlanFragmentB : onViewStateRestored
2023-03-20 22:26:54.105 10679-10679/com.solution.myapplication D/myLog: BlanFragmentB : onStart
2023-03-20 22:26:54.105 10679-10679/com.solution.myapplication D/myLog: BlanFragmentA : onDestroyView
2023-03-20 22:26:54.107 10679-10679/com.solution.myapplication D/myLog: BlanFragmentB : onResume

다시 'SWITCH'를 클릭해서 프래그먼트A에서 프래그먼트 B로 replace 시켜봤다. 프래그먼트 A의 onPause()와 onStop() 호출 후 프래그먼트 B가 프래그먼트 A를 처음 add 했을 때와 같이 표시되는 걸 확인했다.

 

2023-03-20 22:31:51.522 10679-10679/com.solution.myapplication D/myLog: BlanFragmentA : onPause
2023-03-20 22:31:51.522 10679-10679/com.solution.myapplication D/myLog: BlanFragmentA : onStop
2023-03-20 22:31:51.523 10679-10679/com.solution.myapplication D/myLog: BlanFragmentA : onDestroyView

프래그먼트A와 B의 replace 이후 'REMOVE' 버튼으로 remove도 시켜봤다. 표시되고 있던 프래그먼트 A의 onPause()와 onStop() 호출 후 onDestroyView()가 호출되는 걸 볼 수 있었다.

replace때와는 다르게 onStop()과 onDestroyView 사이에 있던 과정들이 없는 이유는 다른 프래그먼트를 표시시킴으로써 해당 프래그먼트가 destroy 되는 것이 아니라 단순히 해당 프래그먼트 자체를 없애는 것이기 때문이고 반대로 replace때는 표시하려는 다른 프래그먼트가 유저에게 시각적으로 보일 수 있는 모든 과정이 완료되고 난 후에 현재 보이고 있던 프래그먼트의 destroy가 실행된다는 걸 볼 수 있었다.

 

각 콜백 메서드들의 호출 시점은?

이제 간단한 프래그먼트 사용도 해봤고, 생명 주기가 실제로 돌아가는 모습도 확인했으니 각 콜백 메서드들의 호출 시점을 알아보자.

 

onAttach() : 프래그먼트가 액티비티에 붙여질 때 호출된다.

onCreated() : 프래그먼트가 생성될 때, 즉 FragmentManager에 add될 때 호출된다.

onCreateView() : onCreated()이후 바로 호출된다. 

onViewCreated() : onCreateView()가 정상적으로 호출됐다면 리턴되는 View 객체를 받아 호출된다. 이때 프래그먼트 데이터를 초기화하면 된다.

onViewStateRestored() : 저장되어 있던 모든 상태 값이 복원되었을 경우 호출된다. View에 저장되어 있던 각종 데이터들을 가리킨다.

onStart() : 액티비티와 마찬가지로 유저에게 보여질 수 있을 때 호출된다.

onResume() : 액티비티와 마찬가지로 유저의 상호작용이 가능한 상태일 때 호출된다.

onPause() : 유저가 프래그먼트에서 떠날 때 호출된다.

onStop() : 유저에게 프래그먼트가 화면에 보여지지 않게 될 때 호출된다.

onSaveInstanceState() : editText나 ListView 스크롤 위치와 같은 View 계층 구조의 임시 정보를 저장할 때 호출한다.

onDestroyView() : 프래그먼트와 관련된 뷰가 제거될 때 호출된다.

onDestroy() : 프래그먼트가 완전히 제거될 때 호출된다.

 

마치며

어렵다... 비교적 단순한 액티비티에 비하면 꽤 복잡해 보인다. 액티비티도 제대로 파고들면 장난아니게 복잡하더라지만... 아무래도 써보면서 눈에 보이는 것들이 있어야 익숙해질 것 같긴 하지만 무의미한 시간은 아니었다. 그리고 꽤 변경된 것들이 많았다. 아예 콜백 메서드가 추가되고 삭제되거나 이미 존재하는 콜백 메서드들의 순서가 바뀌는 등의 수정이 꽤나 많았더라. 이런 걸 알게 된 것만 해도 충분히 도움이 됐다고 본다.

 

당연하게도 쓰는 본인 조차 이해가 잘 되지 않아서 정확하고 이해하기 쉬운 설명과 함께 정리할 수는 없었다. 더 상세하고 도움 되는 내용들은 이 글을 쓰며 본 참고 자료들이 많다. 이 자료들을 살펴보며 도움이 되길 바란다.

 

***

이런 젠장 onDetach()도 있는데 까맣게 잊고 테스트 해보지 못했다....

 

 

 


https://developer.android.com/guide/components/fragments?hl=ko 

 

프래그먼트  |  Android 개발자  |  Android Developers

A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section

developer.android.com

https://readystory.tistory.com/199

 

[Android] 의외로 잘 모르는 Fragment 의 Lifecycle

많은 앱들이 여러가지 이유로 single activity application 을 지향하고 있습니다. 따라서 Fragment 로 UI 를 구성하는 경우가 굉장히 많은데요. 이때 많은 개발자들이 Activity 의 Lifecycle 에 대해서는 잘 알고

readystory.tistory.com

https://velog.io/@evergreen_tree/Android-%ED%94%84%EB%9E%98%EA%B7%B8%EB%A8%BC%ED%8A%B8-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0

 

[Android] 프래그먼트 생명주기

이전 포스팅에 이어서 프래그먼트 생명주기를 정리해 보았다. 액티비티와 별개로 자체 생명 주기를 가지고 있지만, 액티비티의 생명주기와 유기적으로 연관되어 있다.프래그먼트가 액티비티에

velog.io

https://juahnpop.tistory.com/224

 

안드로이드 코틀린 : Fragment 추가, 변경, 삭제 사용법 및 유의점

Android Kotlin : Activity에 Fragmeent 추가, 변경, 삭제 및 고려사항 정리 안드로이드 개발자 가이드에서는 (다양한 이유로) 다수의 화면을 포함하는 앱은 다수의 Activity가 아닌 Fragment 사용하길 권장합니

juahnpop.tistory.com

https://zibro.tistory.com/13

 

[Android] Fragment LifeCycle

Fragment란? Fragment는 앱 UI의 재사용 가능한 부분을 나타냅니다. Fragment는 자체 Layout을 정의 및 관리하고 자체 생명주기를 가지며 자체 입력 이벤트를 처리할 수 있습니다. Fragment는 단독으로 존재

zibro.tistory.com

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기