[Android] Lifecycle (생명주기)

민채·2024년 2월 15일
0

Android

목록 보기
3/16

안드로이드를 처음 시작한다면 무조건 들어보는 생명주기!
진짜 이거땜에 플젝하면서 고생 많이 했던 기억이 있다...🤦‍♀️

안 까먹기 위해 정리하는 글!

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이 종료되었음을 의미

참조

profile
코딩계의 떠오르는 태양☀️

0개의 댓글