액티비티가 백스택에 push된 상태에서 메모리가 부족해져 시스템에 스택의 액티비티를 kill 하게 된 상황을 생각해보자.
만약 그 화면에 EditText 등 사용자 인터페이스 데이터가 포함되어있다면? 사용자가 다른 액티비티를 종료하고 스택의 액티비티를 포그라운드로 불러온다면 어떻게 될까?
👉 시스템은 새로운 액티비티 인스턴스를 생성하고 전의 데이터는 유실되어 없다.
매끄러운 전환을 위해 동적 상태를 저장하는 것이 필요하다.
이렇게 적시에 액티비티 상태를 저장, 복원하기 위해 생명주기가 고안되었다! 그리고 각 상황에 맞는 처리를 지원하기 위해 Lifecycle callbacks를 제공한다.
각 라이프사이클의 의미와 그에 따라 각 콜백에서 처리해야 할 일을 알아보자.
Back Stack
사용자에게 보이기 위해 갖는 구조로, FILO를 따르며 열린 순서대로 스택에 쌓임
- 기본구조
- 예시
액티비티 인스턴스가 최초로 생성될 때
👉 액티비티의 전체 생명주기 중 한 번만 발생해야하는 시작 로직을 구현해야함
ex. setContentView, 액티비티와 ViewModel연결, 일부 변수 초기화 등
액티비티의 생성이 완료되고 사용자 인터페이스가 곧 사용자에게 보여질 것(포그라운드로 보내지는 것)을 알림
👉 통신이나 센서 처리 시작, UI 관리코드 초기화
전에 onSaveInstanceState 콜백에서 액티비티 정보를 저장해 savedInstanceState가 null이 아닌경우에 onStart 뒤 호출
👉 savedInstanceState로 받은 데이터를 액티비티에 설정
스택 맨 위로 이동해 사용자와 상호작용이 일어날 때
(액티비티가 포그라운드로 올라가 사용자의 Focus를 잡았을 때)
👉 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화(필요한 애니메이션 실행 등의 화면 갱신 처리, 카메라 미리보기 시작)
현재의 동적상태 데이터를 저장할 수 있게 액티비티가 소멸되기 직전에 호출
👉 Bundle 객체를 전달받으면 그 객체에 데이터를 넣음 참고
액티비티 위에 다른 액티비티가 백스택에 올라와서 Focus를 잃었을 때 호출
👉 액티비티가 pause상태일 때 잠시 일시중지여야 하는 것들을 일시중지 및 조정
ex. GPS, 시스템리소스 등 일시 해제
사용자에게 보이지 않을 때
👉 화면에 해당 액티비티가 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지
ex. 애니메이션 일시중지, 디비에 정보 저장 작업
유저가 해당 액티비티로 다시 돌아갈 때
👉 보통 아무 작업 안 함
액티비티가 소멸되기 전 호출
단, 두 상황 중 하나에 해당할 때 호출
1. 사용자가 액티비티를 완전히 닫거나, 액티비티에서 finish()를 호출해 액티비티가 종료되는 경우
2. Configure 변경(기기회전, 멀티윈도우 모드 등)으로 인해 시스템에 일시적으로 액티비티를 소멸시키는 경우
👉 onStop, onPause에서 해제되지 않은 모든 리소스를 해제해야 함
ex. 필요없는 리소스 해제, 액티비티 참조 정리
어떤 빌드업 이벤트에서 초기화 작업을 실행하든 빌드업 이벤트에 상응하는 수명 주기 이벤트를 사용하여 리소스를 해제해야함
다른 액티비티 상태도 같이 체크해보자
[액티비티A가 액티비티B를 startActivity()로 호출]
1.액티비티A 생성
A onCreate - A onStart - A onResume
2.startActivity() 호출
A onPause - B onCreate - B onStart - B onResume - A onStop
3.press back key
B onPause - A onRestart - A onStart - A onResume - B onStop - B onDestroy
+) 액티비티B가 호출되고 액티비티B의 onStart에서 finish() 호출
A onPause - B onCreate - B onStart - A onResume - B onStop - B onDestroy
ㅤ
왜 이럴까?
onStop은 뷰에서 보이지 않을때까지 호출되지 않는다. 따라서, 다른 액티비티가 화면을 가리기 전까지 onStop은 호출되지 않는다.
LifecycleObserver
👉 이 방법을 통해 크고 복잡한 코드를 쪼갤 수 있다
https://stackoverflow.com/questions/9963381/android-activity-lifecycle-state-order-when-new-activity-starts
https://developer.android.com/guide/components/activities/activity-lifecycle#tba