본문 바로가기

Android/이론

[안드로이드] Fragment 생명주기 ― Activity 생명주기와의 관계

728x90
반응형

Fragment Lifecycle


왼쪽은 Fragment의 Lifecycle, 프래그먼트 수명주기입니다.

생명 주기는 Android 작동 방식의 핵심으로, 생명 주기를 준수하지 않으면 메모리 누출 또는 애플리케이션의 비정상 종료가 발생할 수 있습니다.

Activity와 비슷한 콜백 메서드 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()가 있습니다. 콜백 메서드, 즉 Callback 함수는 특정 이벤트가 발생할 때 호출되는 함수입니다.

다음은 프래그먼트에서 최소한으로 구현해야 하는 3개의 생명 주기 메서드입니다.

  • onCreate()

프래그먼트를 생성할 때 호출합니다. 프래그먼트가 일시정지 혹은 중단 후 재개되었을 때 유지하고 있어야 하는 것을 여기서 초기화 해야합니다.

 

  • onCreateView()

프래그먼트가 자신의 인터페이스를 처음 그리기 위해 호출합니다. View를 반환해야 합니다. 이 메서드는 프래그먼트의 레이아웃 루트이기 때문에 UI를 제공하지 않는 경우에는 null을 반환하면 됩니다.

 

  • onPause()

사용자가 프래그먼트를 떠나면 첫번 째로 이 메서드를 호출합니다. 사용자가 돌아오지 않을 수도 있으므로 여기에 현재 사용자 세션을 넘어 지속되어야 하는 변경사항을 저장합니다. 

 

 

다음은 그 외에 Activity 생명주기와 같은 메서드 입니다.

  • onStart()

액티비티가 시작됨 상태에 들어가면 이 메서드를 호출합니다. 사용자에게 프래그먼트가 보이게 되고, 이 메서드에서 UI를 관리하는 코드를 초기화 합니다. 이 메서드는 매우 빠르게 완료되고, 완료되면 Resumed(재개)상태로 들어가 onResume() 메서드를 호출합니다.

 

  • onResume()

이 상태에 들어갔을 때 사용자와 상호작용 합니다. 어떤 이벤트가 발생하여 포커스가 떠날 때 까지 이 상태에 머무릅니다. 프로그램이 일시정지되어 onPause()를 호출하고 다시 재개되면 onResume() 메서드를 다시 호출합니다. 재개 상태로 전환될때마다 필요한 초기화 작업들을 수행해야 합니다.

 

  • onStop()

다른 액티비티가 완전히 화면을 가리게 되면 호출합니다.  여기에서 화면에 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있습니다. 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야 합니다. onPause()대신 onStop()을 사용하면 사용자가 멀티 윈도우 모드에서 Activity를 보고 있더라도 UI 관련 작업이 계속 진행 됩니다. 또한 onStop()을 사용하여 CPU를 많이 소모하는 종료 작업을 실행해야 합니다. 예를 들면 그 작업은 데이터 베이스에 저장할 시기가 될 수도 있습니다.

액티비티가 중단되면 액티비티 객체는 메모리 안에 머무르게 됩니다. 이 객체가 모든 상태 및 멤버 정보를 가지고 관리하지만 연결되 있지는 않습니다. 다시 시작되면 이 객체를 다시 호출합니다. 최상위 상태가 재개되어도 콜백 메서드 중에 생성된 요소는 다시 초기화할 필요가 없습니다. 또한 시스템은 레이아웃에 있는 각 View 객체의 현재 상태도 기록하므로 사용자가 EditText 위젯에 텍스트를 입력했다면 내용이 저장되기 때문에 저장, 복원할 필요가 없습니다.

액티비티 또는 프래그먼트가 정지되면 시스템이 onSaveInstanceState()를 호출하여 간단하고 가벼운 UI상태를 저장합니다. 재정의하여 사용할 수 있습니다.

Activity 생명주기에서는 이상태에서 다시 시작하면 onRestart()를 호출합니다. 또한 실행을 종료하면 onDestroy()를 호출합니다.

액티비티와 프래그먼트의 수명 주기에서 가장 중요한 차이점은 백스택에 저장되는 방법에 있습니다. 액티비티는 정지되면 시스템에서 관리하는 액티비티의 백 스택에 들어갑니다. 하지만 프래그먼트는 이를 제거하는 트랜잭션에서 addToBackStack()을 호출하여 인스턴스를 저장하라고 명시적으로 요청할 경우에만 액티비티에서 관리하는 백 스택으로 들어갑니다.

 

  • onDestroy()

Activity 또는 Fragment가 소멸되기 전에 호출됩니다. 사용자가 Activity를 완전히 닫거나 구성변경으로 인해(기기회전 또는 멀티 윈도우 모드) 시스템이 일시적으로 소멸시키는 경우에도 호출 됩니다. 여기에서는 이번 콜백 메서드(onStop()등)에서 해제되지 않은 리소스들을 해제해야 합니다.

 


 

 

Activity 생명 주기와 조화


프래그먼트의 생명주기는 액티비티의 생명주기와 비슷합니다. 액티비티와 마찬가지로 재개(Resumed), 일시정지(Paused), 정지(Stopped) 세가지 상태로 존재할 수 있습니다.

  • Resumed

프래그먼트가 실행중인 액티비티에 표시됩니다.

  • Paused

다른 액티비티가 포그라운드에 있고 포커스되었지만, 이 프래그먼트가 있는 액티비티도 여전히 표시되고 있습니다. (포그라운드의 액티비티가 부분적으로 투명하거나 전체화면이 아니기 때문)

  • Stopped 

프래그먼트가 보이지 않습니다. 호스트 액티비티가 정지되었거나 프래그먼트가 액티비티에서 제거되었지만 백 스택에 추가되었습니다. 정지된 프래그먼트의 모든 상태 및 멤버 정보는 보존됩니다. 하지만 사용자에게는 더이상 표시 되지 않으며 액티비티를 종료하면 프래그먼트도 종료 됩니다.

 

 

 

프래그먼트가 있는 액티비티의 생명 주기는 해당 프래그먼트의 생명주기에 영향을 미칩니다. 액티비티 생명 주기 콜백 메서드가 각 프래그먼트에 비슷한 콜백 메서드를 발생시킵니다. 예를 들어 액티비티가 onPause를 호출하면, 해당 액티비티 내의 프래그먼트도 onPause를 호출하게됩니다.

하지만 프래그먼트에는 프래그먼트만의 고유한 상호작용을 처리하는 다음의 콜백 메서드가 더 있습니다.

  • onAttach()

프래그먼트가 액티비티와 연결되어 있었던 경우 호출됩니다. 여기서 액티비티가 전달됩니다.

 

  • onCreateView()

프래그먼트와 연결된 View Layer를 생성하기 위해 호출 됩니다.

 참고.  onCreateView()에서 view가 초기화중이기 때문에 충돌이 일어날 수 있습니다. 그래서 onCreateView()에서 레이아웃을 inflate하지만 findViewById 등을 사용하여 초기화 하지는 않아야 합니다. 왜나하면 몇가지의 뷰들은 적절히 초기화 되어있지 않았을 수 있기 때문입니다. 그래서 View가 완전히 생성되었을때 호출되는 onViewCreated() 메서드에서 findViewById를 사용하여 초기화 해야 합니다. onViewCreated는 완전히 View가 생성되었음을 확신시켜줍니다.

 

  • onDestroyView()

프래그먼트와 연결된 View Layer가 제거되는 중일 때 호출됩니다.

 

  • onDetach()

프래그먼트가 액티비티와 연결이 끊어지는 중일 때 호출됩니다.

 


 

 

참고문서

 

더 알아 보기

 

728x90
반응형