ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Activity, Fragment, FragmentView LifeCycle
    Android 2024. 12. 25. 18:00
    728x90
    반응형

    라이프사이클이 좀 헷갈려서 다시 정리해봄


     

    Activity는 뭘까?

    앱이 수행하는 작업(task)의 기반이 되는 요소이고, 앱과 사용자의 상호작용을 위한 진입점 역할 및 ui를 구성하는 역할을 하는 컴포넌트이다

     

    점점 단말기 성능은 좋아지고 있지만 메모리는 pc에 비해서 제한되어있다

    따라서 제한된 메모리를 효율적으로 관리해야한다. 따라서 앱이 실행되는 동안 앱을 구성하는 컴포넌트들의 생명주기와 상태변화를 관리해야한다

     

    예를 들면 사용자들이 앱을 실행시켰다가 다른 앱을 켤 수도 있고, 종료시켰다가 다시 돌아오기도 하거나

    앱을 세로에서 가로 모드로 바꾸는 등 여러가지 일들이 발생할 수 있다.

    이러한 상태변경이 생겼을 때 이 상태들이 가지고 있는 정보들을 유지하고 복원할 수 있어야한다 이러한 작업을 생명주기에 맞추어 작성해 activity의 상태를 관리할 수 있다

    안드로이드에서는 이러한 라이프사이클을 콜백메소드를 통해서 제공한다

     

     

     

     

    1. onCreate()

    - Activity를 처음 만들 때 반드시 구현해야하는 콜백메소드

    - Activity가 생성될 때마다 호출된다 

    - 레이아웃 초기화(setContentView, DataBinding)를 하고 Activity를 viewModel에 연결함

    - onCreate() 매개변수로 savedInstanceState가 있는데 이는 이전상태가 저장된 Bundle 객체를 말한다

    처음 생성된 Activity는 이 Bundle이 null이고, 재생성되었을 때는 해당 상태정보(ui)가 savedInstanceState에 저장된다.

    그리고 savedInstanceState를 이용해 이전 상태로 복원을 할 수 있다 

    2. onRestart()

    - Activity가 stop 상태(onStop()이 호출된 상태)에서 다시 running 상태(다시 사용자에게 보여질 때)로 복귀할 때 호출됨

    - 강제종료가 안 됨

     

    3. onStart()

    - onCreate(), onRestart() 후 Activity가 시작되면 실행되는 콜백메소드

    - Activity가 화면에 보이기 시작할 때 호출(단, 사용자와 상호작용은 못하는 상태)

    - onStart() 후 Activity가 포그라운드에 표시되면 onResume(), 안 보이면 onStop()이 호출된다

    - 네트워크 연결, 무거운 resources(카메라, 애니메이션 등)을 로딩 등의 리소스 등록

     

    4. onResume()

    - 사용자와 상호작용할 수 있는 상태

    - 이 단계에서 Activity Stack의 맨 위에 위치하게 됨

    - 사용자가 다른 Activity로 이동하거나 기기 화면이 꺼지는 등의 포커스가 변하는 일이 발생할 때까지 앱은 onResume 상태를 유지함

    만약 보이지 않는 상태가 되면 onPause()가 무조건 실행된다

     

    5. onPause()

    - 포커스를 다른 Activity가 가져갈 때 호출됨

    - Activity가 일시중지되어 onResume()에서 했던 resources(오디오, 애니메이션, 동영상 등)을 여기서 해제해야함

    - onPause()는 안드로이드에 의해 항상 실행이 보장됨

     

    6. onStop()

    - Activity가 사용자에게 전혀보이지 않게 되면 호출됨

    - 안드로이드 시스템에서 자원이 급하게 필요하게 되면 이 메소드를 실행중이더라도 강제종료될 수 있음

    - onStop()은 호출되지 않을 수도 있기 때문에 이 부분을 고려해서 코드 작성

    - 액티비티가 다시 실행된다면 onRestart() 실행되고, 종료된다면 onDestroy()가 실행됨

     

    7. onDetroy()

    - finish() 호출 등으로 Activity가 종료될 때 자동으로 호출됨

    - onCreate(Bundle)에서 했던 작업을 정리하고 해제한다

    - 정상적인 종료인 경우에는 isFinishing = true, 아니라면 false

     

    * 재생성시

    onSaveInstanceState(Bundle)

    onCreate() -> onStart() -> onRestoreInstanceState(Bundle) -> onResume 실행

    액티비티 라이프사이클과는 직접적인 관련 없음

     

    예를 들어 지금 화면을 가로모드로 바꾼다면 라이프 사이클은 다음과 같다

     

    onPause()에서 현재 동영상 위치나 시간정보를 저장하고 onStop() -> onDestroy() -> onCreate()에서 저장된 위치 복원 -> onStart() -> onResume()을 하게 될 것이다

     

    액티비티뿐만 아니라 프래그먼트에도 라이프사이클이 있다...!

    또한 프래그먼트와 프래그먼트뷰는 각자 별도의 라이프사이클이 있다

     

     

    안드 공홈에는 onAttach는 없었지만 이것도 있기 때문에 같이 작성하겠다

    프래그먼트의 라이프사이클 콜백메소드는 Acvitity와 비슷하다 

     

    1. onAttach()

    - fragment와 Activity가 연결되었을 때 가장먼저 호출되는 메소드

    - 프래그먼트 라이프사이클 동안 한 번만 실행됨

     

    2. onCreate()

    프래그먼트 객체가 생성될 때 호출

     

    3. onCreateView()

    - 프래그먼트에 배치 할 layout(view) 생성

    - layout의 root view를 리턴해야한다

     

    4. onViewCreated()

    프래그먼트 레이아웃이 생성된 직후에 할 작업을 이 메소드 안에 구현함

     

    5. onViewStateRestored

    view의 상태 저장값(Bundle)에 대해서 복원함

     

    6. onStart()

    액티비티의 onStart()를 호출할 때 동작함

     

    7. onResume()

    액티비티가 running 상태일 때 호출됨

     

    8. onPause()

    프래그먼트가 resumed 상태가 아닐 때 호출됨

     

    9. onStop()

    프래그먼트가 started 상태가 아닐 때 호출됨

     

    10. onSaveInstanceState()

    화면의 상태값(Bundle)을 저장할 때

     

    11. onDestroyView()

    onCreateView로 생성한 뷰를 제거할 때 호출

     

    12. onDestroy()

    프래그먼트가 제거될 때 호출됨

     

    13. onDetach()

    onAttach()와는 반대로 프래그먼트가 액티비티와 완전히 분리됨

    반응형
Designed by Tistory.