0. 개요
activity와 fragment의 생명주기는 다르다 왜일까 activity와 fragment에 대해서 알아보고 이 둘의 생명주기의 대해 알아보자.
1. Activity란?
- 정의: 'Activity'는 Android 앱에서 사용자와 상호작용하는 하나의 화면
- 생명주기: 여러 상태(onCreate, onStart, onResume, onPause, onStop, onDestroy)를 가질 수 있으며, 이러한 상태 간의 전환이 생명중기를 형성
- Activity LifeCycle Paradigm
1) onCreate()
- 메서드에서 활동의 전체 수명 주기 동안 한 번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행
- onCreate() 메서드가 실행을 완료하면 시작됨 상태과 되고, 시스템이 연달아 onStart()와 onResume() 메서드를 호출
- 예를 들어 데이터 목록을 바인딩하고, 활동을 ViewModel과 연결하고, 일부 클래스 범위 변수를 인스턴스화 함 그리고 사용자 인터페이스 선언을 한다.
2) onStart()
- 호출되면 활동이 사용자에게 표시되고, 앱은 활동을 포그라운드에 보내 상호작용할 수 있도록 준비
- 매우 빠르게 완료됨, 완료된 후 활동이 Resume 상태로 들어가고 onResume을 호출
- 예를 들어 이 메서드에서 앱이 UI를 관리하는 코드를 초기화
3) onResume()
- 재개된 상태에 들어가면 앱이 사용자와 상호작용, 어떤 이벤트가 발생하여 앱에서 포커스가 떠날때 까지 앱이 이 상태에 머뭄, 예를 들어, 전화가 오거나, 사용자가 다른 활동으로 이동하거나, 기기화면이 꺼지는 이벤트가 이에 해당
- 이 상태에서 수명주기가 구성요소가 포그라운드에서 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화 할 수 있음
- 방해되는 이벤트가 발생하면 활동은 일시중지됨 상태에 들어가고, 시스템이 onPause() 콜백을 호출
- 따라서 onResume()을 구현하여 onPause() 중에 해제하는 구성요소를 초기화하고, 활동이 재개됨 상태로 전환될 때마다 필요한 다른 초기화 작업 수행
4) onPause()
- onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족하다
- 그러므로 데이터를 저장하거나, 네트워크를 호출하거나, 데이터베이스 트랜잭션을 실행해서는 안 됩니다.
- 위와 같이 부하가 큰 종료작업은 onStop() 상태일 때 실행해야 합니다.
- 일시중지됨 상태가 되면 Acitivity 인스턴스를 메모리에 남겨두고 시스템이 onResume을 호출할 때 인스턴스를 다시 호출.
5) onStop()
- 활동이 사용자에게 더 이상 표시되지 않는다면, 중단됨 상태에 들어가고, 시스템은 onStop()콜백을 호출
- 예를 들어 새로 시작된 활동이 화면 전체를 차지할 경우 적용. 시스템은 활동의 실행이 완료되어 종료될 시점에 onStop()을 호출 할 수 있다.
- 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야함.
- 예를 들어, 애니메이션을 이시중지하거나, 세밀한 위치 업데이트에서 대략적인 위치 업데이트로 전환
- CPU를 비교적 많이 소모하는 종료 작업을 실행해야 합니다.(예를 들어 정보를 데이터 베이승 ㅔ저장할 적절한 시기를 찾이 못했다면 onStop() 상태일 때 저장할 수 있습니다.)
활동이 중단되면 시스템은 해당활동이 포함된 프로세스를 소멸 시킬 수 있음. Bundle에 있는 객체 상태가 그대로 유ㅈ되고, 사용자가 이 활동으로 돌아여면 이를 복원
- 활동이 다시 시작되면 onRestart()를 호출, Activity가 실행을 종료하면 시스템은 onDestroy()를 호출
6) onDestroy()
- 활동이 소멸되기 전에 호출
- 다음 중 하나에 해당될 때 이 콜백을 호출
- 사용자가 활동을 완전히 닫거나 활동에서 finish()가 호출되어 활동이 종료되는 경우
(마지막 수명주기 콜백)
- 구성 변경(예: 기기 회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우
(즉시 새 활동 인스튼서를 생성한 다음, 새로운 구성에서 그 새로운 인스턴스에 관해 onCreate()를 호출)
- 활도에 소멸되는 이유를 결정하는 로직을 입력하는 대신 ViewModel객체를 사용하여 활동의 관련 뷰 데이터를 포함해야 합니다. 활동이 구성 변경으로 인해 다시 생성될 경우 ViewModel은 그대로 보존되어 다음 활동 인스턴스에 전달되므로 추가 작업이 필요하지 않습니다.
- ViewModel은 onCleared()메서드를 호출하여 활동이 소멸되기 전에 모든 데이터를 정리해야 합니다.
2. Fragment란?
- 정의: 'Fragment'는 'Activity'내에서 재사용이 가능한 UI의 조각을 나타냅니다. 여러 개의 'Fragment'를 조합하여 하나의 'Activity'내에서 다양한 UI와 기능을 구현할 수 있습니다.
- 생명주기 'Fragment' 또한 그 자체의 생명주기를 가지며, 이는 대체로 'Activity'의 생명주기에 종속적. But, 추가적으로 Fragment만의 특별한 상태(Attach, Create, CreateView, Start, Resume 등)가 있습니다.
- Fragment LifeCycle paradigm
1) 최소한의 생명주기
- onCreate(): 프로그먼트가 일시정지되거나 중단되었다가 재개되었을 때 유지하고자 하는 것을 초기화
- onCreateView(): 이 메서드는 레이아웃의 로트, UI를 제공하지 않는 경우 null을 반환하면 됨
- onPause(): 사용자가 프래그먼트를 떠난다는 것을 나타내는 첫번째 신호. 일반적으로 여기에서 사용자 세션을 넘어서 지속되어야 하는 변경 사항을 커밋
2) 기본적인 Fragment 클래스 대신 확장하고자하는 하위 클래스
- DialogFragment: 부동 대화상자 표시, Activity 클래스의 대화상자 도우미 메서드를 사용하는 것의 좋은 대체 수단
- ListFragment: 어뎁터가 관리하는 항목의 목록을 표시, 목록 뷰를 관리하는데 쓰는 몇 가지 메서드를 제공
(예를 들어 클릭이벤트 처리, 목룍을 표시할 때는 RecyclerView를 포함한 프래그먼트를 만들어야 함)
- PreferenceFragmentCompat: 객체의 계층을 목록으로 표시. 애플리케이션에서 설정 화면을 만드는데 사용
3) 프래그먼트 관리
- FramentManager를 사용하기 우ㅐ해, 액티비티에서 getSupportFragmentManager()를 호출
4) 프래그먼트 트랜잭션 수행
- 트랜잭션: 액티비티에 커밋한 변경사항의 집합
- FramentManager에서 FragmentTrascaction을 가져와 사용할 수 있다.
- add(), remove(), replace()와 같은 메서드 사용
5) 프래그먼트 수명 주기 처리
- onResume
- onPause
- onStopped
6) 액티비티 수명 주기와의 조화
- onAttach(): 프래그먼트가 액티비티와 연결되어 있었던 경우 호출
- onCreateView(): 프래그먼트와 연결된 뷰 계층을 생성하기 위해 호출
- onDestroyView(): 프로그먼트와 연결된 뷰 계층이 제거되는 중일 때 호출
- onDetach(): 프래그먼트가 액티비티와 연결이 끊어지는 중일 때 호출
3. 왜 생명주기가 다른가?
1) 목적의 차이
- 'Activity'는 앱의 독립적인 화면 단위로 작동, 'Fragment'는 'Activity'내에서 UI 조각으로서 작동하기 때문
2) 재사용성
- 'Fragment'는 다양한 'Activity'에서 재사용이 가능하므로, 해당 'Fragment'가 어떤 'Activity'에 포함될지, 언제 추가 혹은 제거될지에 따라 별도의 생명주기 상태가 필요
3) 종속성
- 'Fragment'의 생명주기는 대체로 소속된 'Activity'의 생명주기에 종속적입니다. 따라서 'Activity'가 일시정지 상태가 되면, 포함된 모든 'Fragment'들도 일시정지 상태가 됩니다.
4. 정리
'Activity'와 'Fragment'는 Android 앱 구성의 핵심요소. 이것들의 생명주기를 정확히 이해하고 관리하는 것은 앱의 안정성과 효율성을 높이는데 중유하다.
Reference