본문 바로가기
개발관련

안드로이드(Android) 생명주기(LifeCycle)에 관하여

by MinChan-Youn 2021. 11. 18.

이번에는 안드로이드(Android) 생명주기(LifeCycle)에 관하여 알아보겠습니다.

 

생명주기(LifeCycle)은 크게 Activity와 Fragment 각각 하여 총 2가지에 대해서 알아보겠습니다.

 

 

1. Activity

액티비티 생명주기

 

*알아두면 좋은점

1. 불투명한 새로운 액티비티가 최상단으로 올라와서 기존 액티비티가 완전히 보이지 않게 되면 onPause()에 이어 onStop()까지 호출된다는 점. 불투명 새로운 액티비티가 최상단으로 올라오면 기존 액티비티는 사용자와 더 이상 상호작용을 할 수 없다. 포커스도 새로운 액티비티에 맞춰진다. 그렇기 때문에 onPause()에 이어 onStop()까지 호출되는 것이다.

2. 하지만 새로운 액티비티가 백그라운드 속성값이 투명한 경우는 onPause()까지만 호출이 된다. 

3. 새로운 액티비티가 아닌 다이얼로그를 띄워서 액티비티 최상단이 아닌상황에서는 onPause()도 호출되지 않는다. 즉 다이얼로그는 액티비티의 일부이기 때문이다. 즉 새로운 액티비티가 최상단으로 온 상황이 아니기때문에 아무런 함수가 호출되지 않는다.

 

- 다이얼로그를 제외한 액티비티가 최상단으로 올라오면 onPause()실행 / 최상단 액티비티가 밑에 액티비티를 완전히 보이지 않게 가릴경우 onStop()까지 실행

 

 

 

 

 

 2. Fragment

onCreate()

  1. 최초로 Activity를 실행하면, 처음으로 호출되는 함수입니다.
  2. 초기화 관련 작업을 하면 좋습니다..

onStart()

  1. 최초로 Activity를 실행하면, onCreate() 다음으로 호출되는 함수입니다.
  2. onStop() -> onRestart() 다음으로 호출되는 함수이기도 합니다.
  3. 이 시점부터는 사용자가 액티비티를 볼 수 있습니다.

onResume()

  1. 최초로 Activity를 실행하면, onStart() 다음으로 호출되는 함수입니다.
  2. onPause() 다음으로 호출되는 함수이기도 합니다.
  3. 이 시점부터는 Activity가 활성화 된 상태(실행중인 상태)로 봅니다.

onPause()

  1. 만약 onResume()가 호출된 이후에(Activity가 활성화 된 이후에) 다른 Activity가 최상단에서 보여지는(포커스를 잃은) 경우 호출되는 함수입니다.
  2. 만약 onPause()가 호출된 이후에(다른 Activity가 최상단에서 보여진 이후에) 다시 기존 Activity로 돌아오는 경우 onResume()가 호출됩니다.
  3. 만약 다른 앱이 메모리를 필요로 할 경우 앱 프로세스가 종료될 수 있습니다.

onStop()

  1. 만약 onResume()가 호출된 이후에(Activity가 활성화 된 이후에) 다른 Activity가 최상단에서 보여지는(포커스를 잃은) 경우 + Activity가 완전히 보이지 않는경우 호출되는 함수입니다.
  2. 만약 onStop()이 호출된 이후에(다른 Activity가 최상단에서 보여진 이후에) 다시 기존 Activity로 돌아오는 경우 onStart()가 호출됩니다.
  3. 사용자에 의하거나(ex: onBackPressed() 호출), 시스템에 의해(ex: 자원부족) Activity가 완전히 종료되면 onDestroy() 가 호출됩니다.
  4. 만약 다른 앱이 메모리를 필요로 할 경우 앱 프로세스가 종료될 수 있습니다.

onDestroy()

  1. Activity가 사용자에 의하거나 시스템에 의해 완전히 종료되는 경우 호출되는 함수
    1.1. 사용자에 의해 종료되는 경우는 onBackPressed()호출 , finish()등의 경우가 있습니다.
    (onBackPressed()호출 시, 기존 실행된 엑티비티가 onResume()까지 호출된 후 onDestroy가 호출됨.)
    1.2. 시스템에 의해 종료되는 경우는 대표적으로 자원부족 문제를 해결하기 위한(메모리 확보를 위한)경우가 있습니다.

onRestart()

  1. onStop()이 호출된 이후에(다른 Activity가 최상단에서 보여진 이후에) 다시 기존 Activity로 돌아오는 경우 호출되는 함수
  2. onRestart()가 호출된 이후 이어서 onStart()가 호출됨

 

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

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

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

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

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

*onStop(): 다른 액티비티가 완전히 화면을 가리게 되면 호출. 화면에 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있습니다. 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야함. 

*onDestory(): Activity또는 Fragment가 소멸되기 전에 호출. Activity를 완전히 닫거나 구성변경(기기회전 또는 멀티 윈도우 모드)시스템이 일시적으로 소멸시키는 경우에도 호출. onStop()에서 해제하지 않은 리소스가 있다면 여기서 리소스들을 해제해야함.

 

onAttach()

  1. Activity에서 Fragment를 추가하면 호출됩니다.
  2. 인자로 context를 받아서 Listener interface를 implement한 경우 에 Context를 통해 가져올 수 있습니다. [1]

onCreate()

  1. onAttach()다음으로 호출되는 함수입니다.
  2. 액티비티의 onCreate()와 역할이 비슷합니다.
  3. 단, UI에 관련된 작업(ex. View와 ViewGroup의 ui바인딩과 같은 작업들..)은 할 수 없습니다.
  4. 하지만, UI관련된 작업외, Int형..등등의 변수 초기화 등의 작업정도는 가능합니다.

onCreateView()

  1. onCreate()다음으로 호출되는 함수입니다.
  2. 지금부터, Fragment에 속한 UI관련된 작업을 할수 있는 단계입니다.

onActivityCreated()

  1. onCreate()다음으로 호출되는 함수입니다.
  2. Fragment가 backStack에서 돌아오면 호출되는 함수이기도 합니다.
  3. Activity에서 Fragment 생성이 완료되면 호출되는 함수입니다.

onStart()

  1. onActivityCreated()다음으로 호출되는 함수입니다.
  2. Activity와 마찬가지로 이 시점부터는 사용자가 액티비티를 볼 수 있습니다.

onResume()

  1. onStart() 다음으로 호출되는 함수입니다.
  2. Activity와 마찬가지로 이 시점부터는 Fragment가 활성화 된 상태(실행중인 상태)로 봅니다.

onPause()

  1. Fragment의 호스트 Activity가 포커스를 잃고 다른 Activity가 최상단에서 보여지는 경우 호출된다.
  2. 1번과 같은 경우, Fragment가 backStack으로 들어갑니다.

onStop()

  1. Fragment의 호스트 Activity가 포커스를 잃고 다른 Activity가 최상단에서 보여지는 경우 + Activity가 완전히 보이지 않는경우 호출됩니다.

onDestroyView()

  1. Fragment에 구현된 View가 제거되는 단계입니다.
  2. 이 메소드가 호출된 이후 Fragment가 BackStack에서 돌아오면 onCreateView()가 호출됩니다.

onDestroy()

  1. 프래그먼트를 완전히 제거하기 직전이다.

onDetach()

  1. Fragment가 제거되고, Activity로부터 해제될때 호출됩니다.

Plus Alpha

1-1. Activity의 onCreate의 기능을 Fragment에서는 두가지로 분리했습니다.

  1. onCreate()
  2. onCreateView()

1-2. 그리고, Activity의 onDestroy의 기능도 Fragment에서는 두가지로 분리했습니다.

  1. onDestroy()
  2. onDestroyView()

최초 생성 LifeCycle

  1. onAttatch() : Fragment가 Activity에 붙을 때 호출
  2. onCreate() : Activity에서의 oncreate()와 비슷, ui관련 작업X
  3. onCreateView() : Layout을 inflater하여 View 작업
  4. onActivityCreated() : Activity에서 Fragment를 모두 생성하고 난 다음 호출, 액티비티의 onCreate()에서 setContentView()한 다음이라고 생각 하면 쉽게 이해 될것 같다. 여기서 부터는 ui변경작업이 가능하다.
  5. onStart() Fragment가 화면에 표시될때 호출된다. 사용자의 Action과 상호 작용 할 수 없다.
  6. onResume()

Fragment가 화면에 완전히 그렸으며, 사용자의 Action과 상호 작용이 가능하다.

다른 Fragment가 add

  1. **onPause() :**Fragment가 사용자의 Action과 상호 작용을 중지
  2. **onStop() :**Fragment가 화면에서 더이상 보여지지 않게 되며, Fragment기능이 중지 되었을때 호출
  3. **onDestoryView() : **View 리소스를 해제 할수 있도록 호출, backstack을 사용 했다면 Fragment를 다시 돌아 갈때 onCreateView()가 호출

Replace or backward로 removed되는 경우

  1. **onDestory() :**Fragment상태를 완전히 종료 할 수 있도록 호출 한다.
  2. **onDetach() :**Fragment가 Activity와 연결이 완전히 끊기기 직전에 호출 된다.
  3.  

 

 

 

글을 작성하면서 궁굼점!

왜 Activity보다 Fragment를 사용하는가?

1. Activity는 상대적으로 Fragment보다 무겁다.

2. Activity 내에서 Fragment는 상대적으로 가볍게 추가/제거 가능하다.
3. Activity Stack에 Activity를 쌓아두기보다 Fragment BackStack에서 Fragment를 관리하는게 메모리 관리에서도 효율도 챙기고 화면 전환시에 Activity보다 더 순조롭다.

 

4. 데이터 공유에도 용이

5. 재사용성의 증가

- View or Business Logic을 Fragment 단위로 분리 가능

- 아키텍쳐 원칙에서 가장 중요한 원칙인 관심사 분리를 통해 의존성을 분리하고 독립성을 키우게 된다.

6. 유연한 UI/UX 구현

 

 

 

결국 앱이 커지면 커질수록 각 View에서 처리하거나 해결해야한느 코드가 많이지는데 Activity로는 힘들거나 제약이 많으므로 Fragment를 사용하여 독립성을 높히고 의존성을 낮추는게 목적이 있지않나 싶다.

 

 

 

 

 

 

 

 

 

 

 

*참고자료

1. https://velog.io/@eun3673/application-fundamentals-lifecycle

2. https://bbaktaeho-95.tistory.com/62

3. https://ddangeun.tistory.com/50