액티비티의 생명주기
액티비티의 생명주기는 액티비티는 처음 생성될 때부터 소멸될 때까지 여러 상태를 가지게 된다.
액티비티는 아래 그림과 같이 5가지 상태로 구성된다.
액티비티에서 총 7가지의 콜백 메소드를 활용해서 로그를 출력하게 된다. 액티비티는 이 콜백 메소드를 통해서 상태를 전환하게 된다. (ex. 액티비티가 초기의 initailize 상태에서 create 상태로 전환되기 위해서는 onCreate 메소드가 호출되어야 한다.)
initailize에서 시작한 액티비티가 destroy 상태에 도달하기까지 모든 콜백 메소드가 호출되는 것은 아니다.
onCreate()와 onDestroy() 메소드는 액티비티가 처음 생성될 때와 최종적으로 소멸될 때 각각 호출되게 된다. 따라서 다음 두 메소드는 액티비티의 생명주기에서 단 한번만 호출된다.
액티비티 생명주기의 대표적인 3가지 use case
- Open and Close in Activity
- Open -> onCreate(), onStart(), onResume() 메소드가 순차적으로 호출된다.
액티비티가 Resumed 상태에 도달한 시점부터 사용자와 상호작용할 수 있게 된다.
- Close -> onPause()와 onStop() 메소드가 순차적으로 호출된다.
액티비티가 완전히 소멸되는 것이 아니라 화면상에서만 사라지고 백그라운드에서는 남게 된다. - Navigate back
액티비티에서 다른 액티비티로 이동했다가 다시 돌아올 경우(ex. 액티비티 A에서 액티비티 B로 이동)
- 액티비티 A에서 액티비티 B로 이동하는 경우
onPause()와 onStop() 콜백이 순차적으로 호출되고 액티비티의 상태는 Created 상태로 전환된다. 또한, 화면에 보여지지 않는 background 상에 존재한다.
- 액티비티 B에서 액티비티 A로 다시 돌아오는 경우
onRestart() 콜백이 호출되고 onStart(), onResume()을 거쳐 최종적으로 Resumed 상태에 도달하여 사용자와 액티비티가 상호작용할 수 있게 된다.
*onRestart() 콜백은 액티비티가 최초로 생성될 때 호출되는 것이 아니라 액티비티가 background에서 foreground로 돌아왔을 때만 호출되는 콜백이다. - Partically hide
액티비티가 시스템 권한 요청 다이얼로그와 같은 시스템 팝업 다이얼로그에 부분적으로 가려질 때 액티비티 생명주기의 상태
- 다이얼로그에 가려졌을 때
액티비티는 포커스를 잃게 된다. onPause() 콜백이 호출되고 액티비티는 Started 상태로 전환된다.
*포커스를 얻었다는 것: 액티비티가 사용자와 상호작용할 수 있음을 의미
- 다이얼로그에서 작업을 마치고 액티비티로 돌아왔을 때
액티비티는 포커스를 다시 얻게 된다. onResume() 콜백이 호출되어 액티비티가 Resumed 상태로 전환된다.

구성 변경
디바이스 상태가 변경되어 액티비티를 완전히 종료하고 다시 빌드하는 경우
(ex. 디바이스의 화면 회전 모드를 변경할 때)
액티비티는 onPause()부터 onDestroy()까지 순차적으로 호출한 다음 다시 onCreate()부터 시작해 onResume()까지 호출되게 된다.
onDestroy()에 의해서 액티비티가 강제로 종료되었다가 다시 생성되기 때문에 해당 액티비티의 데이터 손실이 발생할 수 있다.
-> 이런 예외적인 상황에서도 데이터를 안전하게 보관할 수 있는 remember savable이라는 방법이 존재
Android App Architecture
단일 클래스에 모든 코드를 작성한다면 코드 품질과 가독성이 떨어지고, 에러가 발생하면 찾기 어렵기 때문에 유지보수가 어렵다.
-> 이런 문제를 해결하고 일관된 방식을 적용하기 위해 다양한 아키텍쳐가 존재한다.
- Separation of Concerns(관심사 분리)
- Drive UI from a model(Data 모델에서 UI 도출하기)
UI Layer
디바이스 화면에 데이터를 표시하는 역할
사용자 이벤트에 의해 데이터가 변경될 때마다 적절하게 업데이트 되어야 한다.

UDF Pattern
단방향 데이터 흐름
상태는 아래로, 이벤트는 위로 이동

Navigation

- Destinations: 내비게이션을 통해 전환시킬 화면
- NavHost : 실제로 화면에 보이기 위해서 NavController와 Navigation Graph를 연결하는 역할
(*Navigation Graph: 이동 가능한 컴포저블 데스티네이션을 정의하는 역할) - NavController: 내비게이션에서 가장 핵심 구성요소. 앱의 화면과 각 화면을 구성하는 컴포저블의 백스텍을 유지하고 있음
Adaptive Layout