안드로이드를 처음 시작한다면 무조건 들어보는 생명주기!
진짜 이거땜에 플젝하면서 고생 많이 했던 기억이 있다...🤦♀️
안 까먹기 위해 정리하는 글!
Activity Lifecycle
Activity는 화면이 사라지거나 뒤로 가게 될 경우에 특정 메서드를 호출한다.
Activity의 Lifecycle은 Activity가 각각의 상황에서 어떠한 메서드를 호출하는지 알려준다.
Activity Lifecycle을 간략하게 나타낸 사진
onCreate()
- Activity의 생성과 함께 가장 먼저, 최초 1회 실행되는 함수
- setContentView를 통해 View를 inflate함
- View와 관련된 작업이나 리소스 초기화 등의 작업을 수행
- 화면 방향 전환 등으로 Destroy된 이전 Activity 상태에 대한 복원을 위해 savedInstanceState를 가져오는 작업을 수행
ex) 데이터의 binding, ViewModel의 연결, 클래스의 인스턴스화
onStart()
- Activity가 사용자에게 보이기 시작할 때 실행 (포그라운드로 올라올 때 호출)
- 사용자가 다른 Activity에 있다가 다시 돌아올 때 onRestart 다음에 호출
- 사용자가 화면을 통해 상호작용 하기 전에 필요한 작업 수행 (리스너 등록, 애니메이션 처리 등)
onResume()
- Activity의 일부가 보일 때 실행 (다른 Activity가 Activity를 덮어버리거나 전화를 받고 오는 등, 액티비티가 다시 화면에 보여질 때 호출)
- 일부가 보일때부터 전체가 보일 때까지의 시간만큼만 수행되기 때문에 가벼운 작업만을 수행
- 앱이 사용자와 상호작용 가능한 시점
- 앱에서 포커스가 사라지기 전까지 해당 상태에 머무름
onPause()
- 사용자가 잠시 Activity를 떠났을 때 호출 -> Activity가 사용자에게 보이지 않을 때 호출 (전화를 받거나 다른 Activity로 이동하는 경우)
- 사용자에게 보여지지 않을 때 사용할 필요가 없는 기능을 일시중시하는 작업을 수행
onResume()과 onPause()의 차이
- onResume() 메서드는 활동에 포커스가 있을 때 호출되고 onPause()는 활동에 포커스가 없을 때 호출
- 앱이 사용자의 관심 밖으로 이동하게 되면 포커스를 잃고 (onPause) 관심 안으로 들어오면 포커스를 얻는다(onResume)
onStop()
- Activity가 사용자에게 더 이상 보이지 않을 때 호출
- 포그라운드에 있던 Activity가 백그라운드로 이동할 때 호출
- 메모리에 할당된 리소스들 중 중요한 리소스의 해제는 이 시점에 하는 것이 좋음 (CPU 를 비교적 많이 소모하는 작업을 종료해야 함)
onPause와의 차이점
사용자에게 보여지지 않을 때 사용할 필요가 없는 기능을 일시중시하는 작업을 수행하는 것은 같지만 규모가 크고 CPU를 많이 차지하는 종료 작업의 경우 onPause보다는 onStop에서 작업
onDestroy()
- Activity가 완전히 소멸되기 전에 호출
- onPause, onStop에서 해제하지 않은 모든 리소스를 해제하는 동작을 본 함수에서 수행
Activity가 소멸되는 경우
- finish()를 호출
- 사용자가 앱을 종료하는 경우
- 기기 회전 등 화면 구성이 변경되는 경우 실행
onRestart()
- onStop() 상태에서 다시 사용자가 앱의 Activity로 돌아왔을 때 실행
- onRestart가 수행된 후, 다시 onStart() -> onResume() 순서를 진행
- (사용중인 앱에서 홈으로 나갔다가 다시 돌아오거나 다른 Activity로 갔다가 뒤로 가기 버튼을 통해서 돌아오는 경우)
Fragment Lifecycle
Fragment Lifecycle을 간략하게 나타낸 사진
onAttach()
- Fragment가 호스트 액티비티에 연결될 때 호출
- Fragment가 활성화 됨
- Fragment가 FragmentManager(Fragment의 생명주기 관리)에 추가됨
- 작업이 성공적인 경우에만 onCreate()로 넘어감
onCreate()
- Fragment 자체가 생성
- Fragment View는 아직 생성되지 않은 상태이기 때문에 View와 관련된 작업은 하지 않는 것이 좋음
onCreateView()
- Fragment 뷰의 초기화가 이루어짐
- 정상적으로 초기화가 된 경우 뷰 객체를 반환
onViewCreated()
- onCreateView()에서 뷰 객체가 반환된 직후에 호출
- 뷰가 완전히 생성되었음을 보장
- 뷰에 대한 참조 및 작업을 이 시점에서 하는 것이 좋음 (LiveData Observing, Adapter 초기화 등)
onViewStateRestored
- 저장해둔 모든 state 값이 Fragment 뷰의 계층구조에 복원되었을 때 호출
- 각 뷰의 상태값을 체크할 수 있음
- View lifecycle owner는 이때 INITIALIZED 상태에서 CREATED 상태로 변경됐음을 알림
onStart() ~ onDestroy() (onDestroyView() 제외) 까지는 액티비티의 생명주기와 유사하다.
onStart()
- Fragment 가 사용자에게 보여질 수 있을 때 호출된다
- childFragmentManager를 통해 FragmentTransaction을 안전하게 수행할 수 있음
onResume()
- Fragment가 보이는 상태에서 모든 Animator 와 Transition 효과가 종료되었을 때 호출
- 사용자와 Fragment가 상호작용을 할 수 있는 상태
onPause()
- 사용자가 Fragment를 떠나기 시작했지만 Fragment가 조금이라도 보일 때 호출
- 이 시점에서 Fragment 뷰의 생명주기는 PAUSED가 아닌 STARTED 상태가 됨
onStop()
- Fragment 가 더 이상 화면에 보이지 않을 때 호출
- 이 시점에서 생명주기는 CREATED 상태가 됨
- onStop()이 onSaveInstanceState() 함수보다 먼저 호출돼서onStop()이 FragmentTransaction을 안전하게 수행할 수 있는 마지막 지점이 됨
onDestroyView()
- Fragment의 뷰가 소멸될 때 호출
- 이 시점에서 Fragment 자체는 아직 메모리에 남아있음 -> 뷰에 대한 모든 참조를 제거해야 메모리 누수를 방지 할 수 있음
onDestroy()
- Fragment 또는 FragmentManager가 소멸되었을 때 호출
- 이 시점에서 Lifecycle은 DESTROYED 상태가 됨
- Fragment의 Lifecycle이 종료되었음을 의미
참조