Activity 와 Fragment 의 차이

Ddudduu·2021년 12월 21일
0

기본적이지만 막상 물어보면 대답하기 어려운 Activity 와 Fragment 의 차이
알아보자~

Activity

  • 앱이 UI 를 그리는 screen 을 제공함.
  • 사용자는 Activity 를 통해 상호작용할 수 있음.
  • App 의 사용자 인터페이스 주위에 전역 요소를 배치하기에 적합.

Fragment

  • UI 를 개별 요소로 쪼갤 수 있도록 해서 모듈성, 재사용성 ⬆️
    => Fragment 사용할 때를 생각해보자. 하나의 Fragment 를 여러 Activity 에서 갖다 쓰기도 하자나?
  • 단독으로 존재할 수 없다. Activity 안에 여러 Fragment 를 두고 서로 전환하면서 사용하니까!
  • 단일 화면 / 화면 일부의 UI 를 정의하고 관리하는데 적합.

볼드 처리한 줄이 무슨 말인고.. 하니

type 이나 title 을 선택할 수 있는 탐색 창과 목록들을 보여주는 List 로 이뤄진 화면이 있다고 생각해보자.

💻 태블릿이나 landscape 같이 화면이 큰 경우, 왼쪽에 탐색 창을 고정해놓고 오른쪽에는 List 들을 배치할 것이다.

반면, 📱 일반 스마트폰 같이 화면이 작은 경우엔 탐색창을 bottom navigation 으로 작게 만들어놓고 상단에 List 들을 배치할 것이다.

Activity 는 탐색창 (그림의 파란 부분) 을, Fragment 는 List (그림의 초록 부분) 을 정의하고 관리하는데 적합하다고 한다.

이 둘의 가장 큰 차이점은, 생명 주기이다.

Life Cycle

Activity

onCreate()

Activity 를 생성할 때 실행되는 함수이다. 여기서 할 일은, 뷰를 구성하고 데이터 바인딩, ViewModel 과 연결하는 등 초기화 작업들을 하는 것이다. setContentView() 를 이용해 레이아웃을 화면에 띄운다.

onStart()

Activity 가 "시작됨" 상태로 전환되고 사용자에게 표시되면 호출된다.
Activity 를 foreground 로 보내 사용자와 상호 작용할 수 있도록 준비하는 단계이다.

onResume()

Activity 가 사용자와 상호작용 하기 직전! 에 호출되는 함수.
사용자가 터치하거나 뭔가를 입력하는 이벤트들을 포착하며, 앱의 대부분의 핵심 기능은 여기서 구현된다.

onPause()

뒤로 가거나 다른 Activity 가 실행돼, 원래 Activity 가 background 로 갔을 때 호출된다. 다른 Activity 에 가려 일부만 보여지는 경우가 이에 해당한다.

⚠️주의할 점은, 실행 시간이 짧기 때문에 데이터를 저장하거나, 네트워크 호출하는 등 시간이 오래 소요되는 작업들은 여기서 수행해서는 안된다는 것이다. 작업이 완료되기 전에 함수가 끝나버릴 수 있다.

onStop()

Activity 가 사용자에게 더 이상 표시되지 않을 때 호출된다.
1️⃣ onPause() : Activity 가 일부만 가려졌을 때
2️⃣ onStop() : Activity 가 완전히 가려졌을 때
호출된다는 차이점이 있음!

이 함수 다음에 호출될 수 있는 함수가 두가지 있다.
1️⃣ onRestart() : Activity 를 다시 실행할 때
2️⃣ onDestory() : Activity 실행을 종료할 때

onRestart()

Activity 가 "중지됨" 상태였다가 다시 시작될 때 호출된다. 중지한 이후부터 이전 상태를 복원한다.
onRestart() 와 onStart() 는 짝꿍처럼 붙어다니는 존재!

onDestroy()

Activity 가 "중지됨" 상태였다가 종료하면 호출된다. Activity 가 제거되기 전에 요게 호출된다.
여기서는 보통, 모든 리소스를 해제하게끔 만들어준다!

Fragment


Fragment 가 back stack 의 최상단에 추가되는 경우 : CREATED -> STARTED -> RESUMED
Fragment 가 back stack 에서 pop-off 되는 경우 : RESUMED -> STARTED -> CREATED -> DESTROYED

  • Fragment Lifecycle 이 있고 View Lifecycle 이 있다.
    ✅ state 변화 과정 : Fragment 가 callback 함수 호출 ▶️ Fragment 상태 변경 ▶️ callback 종료 ▶️ View Liefecycle 에 event 전달


CREATED

CREATED state 에 다다르면, FragmentManager 에 추가된 것이다.
이 단계에서 이전에 저장되었던 state 들을 복원하며, fragment 의 view 는 여기서 생성되는게 아니다! (view 와 관련된 state 들은 view 가 생성된 이후에 복원되어야 함)

onCreate()
  • Fragment 를 초기 생성할 때 호출된다.



CREATED & View INITIALIZED

  • fragment's view lifecycle 은 Fragment 가 유효한 View 인스턴스를 제공했을 때만 생성된다.
onCreateView()
  • Fragment 가 인터페이스 view 를 인스턴스화하기 위해 호출된다.
  • return 값 : 화면에 보여줄 view
    (non-graphical 한 fragment 는 null 반환)
onViewCreated()
  • onCreateView() 의 반환값이 인자로 들어온다. View 가 생성된 이후.


Fragment and View CREATED

  • fragment's view 가 생성되고나면, 이전 view state 가 복원되고 view 의 Lifecycle 이 CREATED 단계로 이동한다.
onViewStateRestored()
  • 저장된 state 가 복원됐을 때 호출된다.
  • ex) 체크 박스가 체크됐는지 확인하는 작업
    => 저장된 상태를 토대로 초기화하는 함수.


Fragment and View STARTED

  • 이 단계에서는 view 가 available 하다는 걸 보장한다.
    => Fragment 의 child FragmentManager 를 통해 FragmentTransaction 도 안전하게 수행할 수 있다!
  • fragment 의 view 가 non-null 이면, fragment lifecycle 이 STARTED 로 변경된 직후에 view lifecycle 도 STARTED 로 바뀐다.
onStart()
  • Fragment 가 사용자에게 보여질 때 호출된다.


Fragment and View RESUMED

  • fragment 가 보여질 때, Animator, Transition 효과들은 종료되고 사용자와의 상호작용할 준비가 된 상태다!
  • fragment lifecycle 상태가 RESUMED 가 되고, onResume() 함수가 호출된다.
    🅾️ RESUME : fragment 와 상호작용할 수 있는 상태!
    not RESUME : view 에 focus 를 설정하거나 input method 의 visibility 를 처리하려고 하면 안됨!
onResume()
  • fragment 가 화면에 보여지고, running 일 때 호출된다.


Fragment and View STARTED

  • 사용자가 fragment 를 떠났지만, 아직 보이는 상태일 때 STARTED 가 된다.
onPause()
  • Fragment 가 재개되지 않았을 때 호출된다.


Fragment and View CREATED

  • fragment 가 더이상 보이지 않기 시작하면, fragment 와 view 가 CREATED 상태로 진입한다.
  • 언제 바뀌는지?
    1️⃣ 부모 activity 나 fragment 가 정지했을 때
    2️⃣ 부모 activity 나 fragment 의 state 를 저장할 때
onStop()
  • fragment 가 더이상 STARTED 가 아닐 때 호출된다.
onSaveInstanceState()
  • fragment 가 현재 dynamic state 를 저장할 수 있도록 호출된다.
    => 해당 프로세스가 다시 시작되면, 새로운 instance 를 재구성할 수 있음!


Fragment CREATED and View DESTROYED

  • exit animation, transition 이 종료되고 view 는 화면에서 분리되고 (없어지고) 나면 DESTROYED 상태가 된다.
onDestroyView()
  • onCreateView() 로 생성된 view 가 fragment 에서 분리(detach) 됐을 때 호출된다.
  • fragment 가 화면에 다시 보여져야 한다면, 새로운 view 가 생성됨!


Fragment DESTROYED

  • fragment / FragmentManager 가 제거되면, fragment 의 lifecycle 이 DESTROYED 상태가 된다.
onDestroy()
  • fragment 가 더이상 사용되지 않을 때 호출된다.
  • 이 시점에서 생명주기의 끝에 도달한다.
profile
Android

0개의 댓글