본문 바로가기

TIL

TIL 31일차

Activity LifeCycle

액티비티의 생성부터 종료까지의 과정을 구간별로 나눠 그 역할을 설명할 수 있는 개념

7개의 Callback Method로 구성되어 있다

 

** Callback Method란?: 시스템에 의해 호출되는 메서드, 함수도 지정할 수 있다. 주로 비동기 프로그래밍에 사용된다 **

 

1) onCreate(Bundle): 액티비티가 생성될 때 딱 한번 호출된다. 이 메소드는 반드시 오버라이딩 해서 구현해야 한다. savedInstanceState라는 bundle을 받으며 Activity의 이전 상태를 저장하는 역할을 한다. 생성단계에서 setContentView()에 레이아웃을 전달하여 화면을 띄운다

 

2) onStart(): 액티비티가 시작되고 사용자에게 보여지기 직전에 호출되고 매우 빠른 속도로 실행된다. onStart() 콜백 이후 Activity는 onResume 상태가 된다

 

3) onResume(): 액티비티가 'RESUME' 상태가 되어 사용자의 상호작용을 받을 준비가 되었을 때 호출된다. 앱에 interrupt가 없는 이상 앱은 계속 'RESUMED' 상태에 머무른다. 앱이 onPause()에서 interrupt를 처리하고 다시 onResume()으로 돌아올 때(액티비티가 재개될 때)마다 필요한 초기화 작업을 수행한다. 

 

** interrupt란?: 카메라, 전화 등 사용자가 앱에 대한 focus를 일시적으로 잃는 상황, interrupt가 발생하면 onPause()를 호출한다 **

 

4) onPause(): 액티비티에 대한 focus를 일시적으로 잃었을 때, 또는 다른 액티비티에 focus 됐을 때 호출된다. 이후에 다시 액티비티가 focus를 얻으면 액티비티 인스턴스를 다시 불러와 onResume()를 호출한다. 멀티윈도우에서는 Activity가 백그라운드에 위치해도 화면에는 보일수 있다

 

5) onStop(): 액티비티가 focus를 완전히 잃었을 때 호출된다. CPU를 비교적 많이 소모하는 작업을 종료하고 정보를 DB에 저장하는 작업을 수행할 수 있다. 중지 상태이던 Activity가 다시 호출되면 onRestart()가 호출되고, 중지 상태이던 Activity가 완전히 소멸되면 onDestory()가 호출된다.

 

6) onDestory(): 액티비티가 완전히 소멸되기 직전에 호출된다. finish()가 호출되거나 사용자가 앱을 종료할 때, 화면 구성이 변경될 때(멀티 윈도우 모드로 변경할 때, 화면을 가로로/세로로 회전할 때) 액티비티가 소멸된다. Activity에 있는 데이터를 더 이상 쓰지 않는다면 onDestory 단계에서 모두 정리해야 한다

 

7) onRestart(): 액티비티가 중지된 후 다시 시작할 때 호출된다.

 

Activity Lifecycle 를 잘 이용하면 메모리 누수를 방지할 수 있고 그로인해 앱의 성능과 안정성을 높일 수 있다

 

Activity Stack

안드로이드 시스템에서 활성화된 액티비티들의 순서를 관리하는 구조

생성된 액티비티(one, two, three)가 stack 형식으로 쌓인 구조

 

LIFO(Last In First Out) 방식: 즉 가장 늦게 생성된 액티비티가 가장 먼저 실행된다는 뜻이다. 가장 늦게 생성된 액티비티(그림에선 three)가 가장 위(top)에 쌓이게 된다. 이 때 사용하는 맨 위에 있는 액티비티만 상호작용 할 수 있다. 상호작용하는 액티비티가 소멸하면 그 다음으로 위에 있는 액티비티를 재개한다

 

AndroidManifest.xml에서 LaunchMode의 옵션을 바꿔 스택을 쌓는 방식을 변경할 수 있다

** 단 되도록이면 건들지 않는 것을 공식 문서에서 강조하고 있다, 복잡한 부분이기 때문에 꼬일 수 있기 때문 **

 

LaunchMode 종류

1) Standard: 기본으로 설정되어 있는 모드, 액티비티가 호출될 때 마다 task에 저장한다. 백스택에 쌓이기 때문에 사용자가 뒤로가기를 누르면 이전 액티비티로 이동할 수 있다

 

** task란?: 어플리케이션에서 실행되는 액티비티를 보관하고 관리하는 추상적인 틀 **

three가 중복해서 top에 쌓인 모습

 

2) SingleTop: 해당 Activity의 instance가 이미 Activity Stack의 최상위에 있다면, 새로운 instance를 생성하지 않고 기존 instance를 재사용한다

three를 호출하는 대신 onNewIntent()를 호출한다

 

3)  SingleTask: 다중 인스턴스를 생성할 수 없다. 기존 task에 추가될 때, 해당 Activity 위에 있는 모든 다른 Activity는 Stack에서 제거되고 종료된다

사용자가 보기엔 Standard와 똑같다

 

4) SingleInstance: 쌓여있던 스택은 남아있고, 새로운 스택 공간이 하나 더 생긴다. 주로 특별한 리소스에 접근해야 하거나, 다른 액티비티와 완전히 분리되어야 하는 경우에 사용한다

 

 

LaunchMode를 적절히 사용하면 Activity LifeCycle, Stack 관리, 작업 분리 등을 효율적으로 할 수 있다

Fragment LifeCycle

Activity LifeCycle과 마찬가지로 Fragment의 생성부터 종료까지의 과정을 구간별로 나눠 그 역할을 설명할 수 있는 개념

 

1) onCreate(Bundle): Fragment가 생성될 때 호출된다. bundle로 액티비티(또는 프래그먼트)로부터 데이터를 전달받는다

 

2) onCreateView(): FragmentUI를 생성할 때 호출된다. View를 반환해야 된다. Activity와 마찬가지로 savedInstanceState로 이전 상태에 대한 데이터를 제공한다

 

3) onViewCreated(): onCreateView()를 통해 반환된 View 객체가 파라미터로 전달된다. 이 때 fragment 상태는 initialized 상태가 된다. View의 초기값 설정, LiveData observe, RecyclerView, ViewPager2에 사용될 Adapter 세팅 등의 작업은 onViewCreated() 메소드에서 하는 것이 적절하다

 

4) onViewStateRestored(): onSaveInstanceState()에서 저장해둔 상태값을  Fragment의 View 계층구조에 복원할 때 호출된다. 이 때 fragment 상태는 created가 된다

 

5) onStart(): Fragment가 사용자에게 보여질 수 있을 때 호출된다. Activity의 onStart() 시점과 거의 동일하다. 이 때 fragment 상태는 started가 된다

 

6) onResume(): Activity LifeCycle의 onResume()과 유사하게 사용자의 상호작용을 받을 준비가 됐을 때 호출된다. fragment가 보이는 상태에서 모든 animator와 transition 효과가 종료되고, 프래그먼트와 사용자가 상호작용 할수 있을때 onResume()를 콜백한다

 

7) onPause(): 사용자가 곧 Fragment를 떠날 때(다른 액티비티로 전환될 때) 호출된다

 

8) onStop(): Fragment가 사용자에게 보이지 않을 때 호출된다. 부모 Activity나 Fragment의 State를 저장할 때에도 호출된다. API 28 버전을 기점으로 onSaveInstanceState() 함수와 onStop() 함수 호출 순서가 달라져서 이제 onStop()이 fragmenttransaction을 안전하게 수행하는 마지막 지점이 되었다

 

9) onSaveInstanceState(): 시스템이 Fragment의 인스턴스 상태를 저장해야 할 때 호출된다

 

10) onDestoryView(): Fragment의 UI 리소스를 소멸시킬 때 호출된다. 모든 animation과 transition이 끝나고

이 때 fragment 상태는 destroyed가 된다

 

11) onDestory(): Fragment가 소멸될 때 호출된다

 

 

 

Fragment 데이터 전달 방식

Fragment 공식문서에 따르면 2가지 대표적인 데이터 전달 방식을 사용한다

1) ViewModel을 사용하여 데이터 전달: 여러 Fragment 간의 데이터 전달, 또는 Fragment와 사용자 간의 데이터 전달에 주로 사용한다. Fragment LifeCycle을 초과하여 데이터를 유지할 수 있기 때문에 앱의 상태를 유지하는 데 용이하다. 한 Fragment에서 ViewModel의 LiveData에 데이터를 설정하면 다른 Fragment가 그 LiveData를 관찰하는 식으로 데이터를 전달(공유가 좀 더 맞는 표현인 것 같다)할 수 있다

 

 

2) Fragment Result API을 이용한 데이터 전달: Bundle에 배치할 수 있는 데이터가 포함된 일회성 결과 전달에 주로 사용한다

공식문서에서 설명하는 FragmentManager를 사용한 Fragment 데이터 전달 과정(B -> A)

 

Fragment Result API는 Android 10 이상에서만 사용할 수 있기 때문에 하위 버전과의 호환성 문제가 있을 수 있다

'TIL' 카테고리의 다른 글

TIL 33일차  (0) 2024.04.02
TIL 32일차  (0) 2024.04.01
TIL 30일차  (0) 2024.03.27
TIL 29일차  (0) 2024.03.25
TIL 28일차  (3) 2024.03.22