ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프래그먼트 생명주기
    Android 2024. 4. 24. 10:12

    프래그먼트의 생명주기를 이해하는 것은 안드로이드 앱을 효율적으로 관리하고, 사용자에게 부드러운 인터페이스 경험을 제공하는 데 중요하다.

     

    프래그먼트는 액티비티처럼 동작하는 뷰이다. 따라서 프래그먼트도 액티비티와 생명주기가 유사하다.

    예를 들어, 액티비티의 onStart() 함수가 호출되는 순간 해당 액티비티가 출력하는 프래그먼트의 onStart() 함수도 호출된다.

     

    pigma 로 직접 만든 프래그먼트 생명주기

     

    프래그먼트의 생명주기는 크게 5단계로 나눈다.

    초기화(initialized) : 프래그먼트가 FragmentManager에 추가됨. 프래그먼트의 화면을 구성할 뷰가 준비되지 않은 상태
    생성(created) : 프래그먼트의 화면을 구성할 뷰를 준비한다.
    시작(started) : 프래그먼트의 화면이 사용자에게 보인다.
    재개(resumed) : 사용자가 프래그먼트과 상호작용할 수 있는 상태. 포커스를 가지고 사용자의 이벤트를 처리한다.
    소멸(destoryed)

     

    onAttach와 onCreate 함수에서는 뷰 객체를 이용하지 못하므로 뷰와 관련이 없는 초기화 로직을 수행한다.

    onAttach() : 프래그먼트 생명주기에서 가장 먼저 실행된다!

    프래그먼트가 액티비티에 연결되는 시점이다. 아직, 완전히 연결되진 않는다.

    아래와 같은 코드를 보면 더 쉽게 와닿을 수 있다.

    class SearchFragment : Fragment() {
        private lateinit var mContext: Context
        
        override fun onAttach(context: Context) {
            super.onAttach(context)
            mContext = context 
        }
        ...
    }

     

    프래그먼트인데, onAttach에서 context 변수가 Context로 되어있는데, context가 즉 프래그먼트가 붙어있는 뷰, 액티비티를 의미한다. 코드로 보면 더 이해하기 쉬울 것같다.

     

    onCreate() 

    프래그먼트가 생성될 때 호출된다. 초기화 작업, 리소스 바인딩 등을 수행한다.

    백스택을 사용하게 되면 기존 프래그먼트는 onCreateView 부터 재시작하기 때문에, onCreate 는 처음에 단 한번만 실행된다. 따라서, 해당 부분에 코드를 잘 작성하지 않고, onCreateView 에 대부분의 코드를 작성하게 된다.


    onCreateView() 

    매개변수로 LayoutInflater 객체가 전달되므로 대부분 해당 함수에서 프래그먼트의 화면을 구성할 뷰 객체를 준비한다.

    백스택을 통해서, 뷰가 재시작 될 때 해당 메소드부터 콜백이 실행되어, 코드를 여기서 많이 작성하게 된다. 


    • onViewCreated() : 액티비티와 프래그먼트의 뷰가 모두 생성된 상태이므로, 뷰와 관련된 초기화를 수행한다.
    • onStart() : 프래그먼트가 사용자에게 보여질 준비가 되었을 때 호출된다. 필요한 리소스를 할당하거나, 애니메이션을 시작한다.

    • onResume() : 프래그먼트가 사용자와 상호작용할 수 있는 상태가 되었을 때 호출되고, 프래그먼트가 포그라운드에 있을 때 실행되는 작업을 해당 함수 내부에서 처리한다.

    • onPause() : 프래그먼트가 일시정지될 때 호출된다. 상태 저장, 스레드 중지 등의 작업을 수행한다.

    • onStop() : 프래그먼트가 더이상 사용자에게 보이지 않을 때 호출된다.리소스 해제, 스레드 정지 등을 수행한다.

    onDestroyView() : 프래그먼트의 뷰와 관련된 리소스를 정리할 때 호출된다.

    override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }

     

    보통 이때 binding 를 해제한다. (리소스 낭비를 막기 위해)


    • onDestroy() : 프래그먼트가 파괴될 때 호출된다. 프래그먼트의 상태를 정리하고, 모든 리소스를 해제한다.
    • onDetach() : 프래그먼트가 액티비티로부터 분리될 때 호출된다. 프래그먼트가 액티비티와의 모든 연결을 해제한다.

    다른 프래그먼트로 교체될 떄는 백 스택(back stack)을 사용하는 지에 따라 생명주기가 다르게 동작한다.

    백 스택은 프래그먼트가 화면에 보이지 않는 순간 제거하지 않고 저장했다가 다시 이용할 수 있는 기능이다.

    백 스택을 이용하면 사용자가 기기의 뒤로가기 버튼을 누를 때 이전 프래그먼트로 화면을 전환할 수 있다.

    백 스택을 사용하면 onDestroyView() 상태에 있던 프래그먼트가 다시 화면에 보여질 때 onCreateView() 상태로 넘어간다.

    그러나 백 스택을 사용하지 않으면 프래그먼트가 교체될 때 기존의 프래그먼트는 onDestory 까지 호출되어 제거된다.

     

     

    'Android' 카테고리의 다른 글

    Multi View Type RecyclerView  (0) 2024.04.29
    다이얼로그  (0) 2024.04.25
    개인 과제 트러블 슈팅(프래그먼트 트랜잭션)  (0) 2024.04.22
    Fragment 3가지 데이터 전달 방식  (0) 2024.04.19
    [Android] RecyclerView  (0) 2024.04.15
Designed by Tistory.