Fragment LifeCycle

2020. 3. 3. 17:50android

1. Fragment란? 


오늘날 우리는 자그만한 휴대폰을 시작으로 테블릿까지 큰화면 휴대용 기기를 지니고 다닐수 있게 되었다.

기존에 휴대폰처럼 작은 화면을 사용했을 땐 한 화면에서 여러화면을 보여주는 것은 비효율적이다. 

하지만 테블릿처럼 큰화면을 사용하는 기기에서는 한 화면을 가지고서 여러 화면을 띄우는게 효율적인 측면이 분명 존재한다. 예를들면 한쪽은 영화를 보면서 다른 한쪽은 카카오톡을 켜 사람들과 소통을 한다던가..(여자친구 이야기) 큰화면이 제공되어지면서 사람들의 편리성까지 더하자는 아이디어가 같이 대두되었다. 그래서 이런 니즈를 충족하기 위해 나온 것이 fragment다.

 

2. 장점


 

1. 한 화면을 여러 개로 쪼개서 별도로 동작하게 할 수 있다.

2. fragment는 재사용이 가능하다.

 

한 화면에 어떻게 여러가지 화면을 띄울 수 있는가? 이는 fragment가 activity에 붙여져서 보여지기에 가능한 것이다. 따라서 항상 fragment는 activity에 호스팅 되어지고 기본적으로 호스팅되는 activity의 라이프사이클에 영향을 받게된다.이는 당연하다. 왜냐하면 fragment는 activity에 붙여져야지만 사람들에게 보여질 수 있으니.. activity가 없어지면 자연스레 붙여진 fragment도 없어지기 때문이다.

 

그러다면 fragment의 라이프 사이클은 activity와 똑같이 작동할까? 아니다. fragment가 activity에 붙여져서 생성된다고 했다.

 

1) onAttach()

activity에다가 fragment를 붙이기 위한 작업이 수행되어진다. 이때 액티비티의 context를 얻어올 수 있다.

 

2) onCreate()

 

액티비티와는 다르게 플래그먼트의 onCreate메서드는 필드값을 설정하거나 인자로 넘어오는 bundle을 통해서 값을 복구하는 역할을 한다. 이유는 플래그먼트는 다양한 이유로 재생성 되므로 순간 값을 잃어버리는 경우가 많기 때문에 이를 방지하기 위한 처리를 onCreate()에서 해준다. 

 

3) onCreatedView()

 

플래그먼트에서 뷰와 필드값을 바인딩 시켜주는 부분을 해당 메서드에서 하기를 구글에서 권장하고 있다. 때문에

이 메서드에서 fragment의 내용물을 만들고 가져올 수 있다. 따라서 변수와 바인딩하는 부분은 이 메서드에서 진행하면 된다.

 

좀더 자세하게 들어가보자. onCreateView(LayoutInflater inflater,ViewGroup viewgroup,Bundle saveInstanceState)등의 파라미터를 받는다. 왜 이 파라미터가 주어질까? 하나씩 살펴본다.

먼저 inflater는 layout xml 파일을 view 객체로 인스턴스화시켜주는 놈이다. 즉 view로 만들어준다는 것이다. 

 

두번째로 container라고 선언된 ViewGroup이다. inflater로 인해 만들어진 view 객체를 container에 포함시킨다.

여기서의 container는 액티비티가 되므로 플래그먼트 정의 답게 플래그먼트에서 생성된 부분을 액티비티에 추가하는(붙이는) 것이다.

 

 

4) onActivityCreate()

 

Activity의 onCreate()메서드가 끝나고나서 호출되어진다. 이는 activity에 fragment가 생성되어진 초기상태를 의미하면서도 activity와 fragment가 본격적으로 연결되어졌음을 의미한다.

 

5) onStart()

 

 activity의 onStart() 메서드처럼 사용자에게 보여지기 위해 포그라운드에 올리는 작업을 한다. 

 

 

6) onResume()

 

메서드도 마찬가지로 activity onStart() 메서드처럼 사용자와 실제로 상호작용을 하는 부분이다.

 

7) onPause()

 

메서드는 사용자가 fragment를 떠난 첫번째 신호이다. 혹은 화면 전체가 가려지지 않은 상태여서 fragment가 전경에 보일 때도 이 단계로 온다. 이 단계에서는 사용자의 세션과 상관없이 지속되어야하는 정보들을 임시적으로 저장하고 복구할 수 있는 코드를 작성해야한다. 

 

8) onStop()

 

메서드는 더이상 사용자에게 fragment가 보이지 않을 때 호출되어진다. 이는 호스팅하고 있던 activity가 정지되었거나 프래그먼트가 액티비티가 제거되어졌지만 backstack에 저장된 경우도 존재한다. 

 

cf)여기서 activity와 fragment의 가장 중요한 차이점이 나온다. 이는 바로 backStack에 들어가는 것에 대한 차이이다. 먼저 activity가 정지되었을 때 이는 자동으로 backStack에 들어가 저장된다. 그리고 back키를 눌르면 stack에 top에 위치한 activity가 pop되어 다시 사용자에게 보여진다. 하지만 fragment는 addToBackStack()이란 함수를 명시적으로 사용하여 인스턴스를 저장하라고 요청해야 호스트 액티비티에서 관리하는 stack에 들어가게된다. 

 

9) onDestroyView()

 

메서드는 프래그먼트와 연결된 뷰 계층이 제거되는 중일 때 호출되어진다. 

예로 플래그먼트를 stack에 쌓는다고 가정했을 때, onDetach()되면서 사라지는 일 없이 현재 콜백 메소드 단계에 머무르게되고 fragmentA는 호스트 액티비티가관리하는 backstack으로 들어가 저장된다.

 

10) onDestroy()

 

 프래그먼트가 더 이상 사용되지 않을 때 호출되어지는 메소드다. 하지만 액티비티랑 연결이 끊어진 상태는 아니다.

 

11) onDetach()

 

완전하게 액티비티와 플래그먼트간의 연결이 끊어졌을 때 호출되면서 플래그먼트도 파기된다.

 

'android' 카테고리의 다른 글

newInstance()로 Fragment 생성해야하는 이유  (0) 2020.08.12
RecyclerView 2탄! item 클릭 시, 화면전환하기  (0) 2020.04.22
RecyclerView 사용해보기!( 1부 )  (1) 2020.04.17
Android Context  (6) 2020.02.24
Activity Lifecycle  (6) 2020.02.23