안드로이드의 시작과 끝은 Activity와 Fragment의 lifecycle이다 할 수 있을 정도로 lifecycle에 대한 중요성은 여러번 말해도 모자르지 않다 싶다.
이전부터 개발자들이 가져왔던 고민들은 앱의 화면방향 전환이 일어나는 경우, 언어가 변경되는 경우, 화면 해상도가 변경되는 경우 등
다양한 변수로 인해 기존의 Activity 혹은 Fragment가 destroy된 이후 다시 재생성되는 케이스를 어떻게 대처할 것인지 일 것이다.
이러한 환경에서 주요 변수를 보존하기 위해 안드로이드는 savedInstanceState를 제공한다.
재생성 및 savedInstanceState에 관해 중요한 내용들을 간단히 정리해 보았다!
Activity 및 Fragment
- Activity가 Background에 진입하게 되면 onStop 이후 onSavedInstanceState로 필요한 정보를 저장한다.
- Activity가 재생성되는 경우 onStart 이후 onRestoreInstanceState로 저장한 정보를 로드한다.
- 현재 Activity 이전 onStop 이후 상태에 있던 Activity가 있는 상황에서 재생성이 일어나는 경우, 재생성 이후 이전 Activity로 복귀시 onDestroy > onCreate > onStart > onRestoreInstnaceState > onResume의 lifecycle을 거치게 된다.
- 현재 Activity 이전 onStop 이후 상태에 있던 Activity가 있는 상황의 앱이 백그라운드에 있고, 여기서 process kill이 일어나는 경우, 재생성 이후 이전 Activity로 복귀시 onCreate > onStart > onRestoreInstnaceState > onResume의 lifecycle을 거치게 된다.
- 투명 Activity를 Activity에서 새롭게 수행하는 경우, 투명 Activity가 onStart를 거친 이후에도 onPause 외에는 onStop이나 saveInstanceState를 거치지 않는다.
- Fragment는 Activity와 생명주기를 함께하며, onStop 이후 onSavedInstanceState도 동일하게 수행한다.
Android ViewModel
- AAC의 ViewModel을 사용하는 경우, ViewModel의 생명주기는 선언되고 사용되는 시점부터 사용처인 Activity가 onDestroy되기 이전까지는 onCleared를 거치지 않는다.
- 따라서 상태 변경 및 재생성으로부터 AAC ViewModel은 자유롭다.
- 하지만 AAC ViewModel도 시스템에서 수행하는 process kill로 앱의 프로세스가 죽게 되면, 마찬가지로 갖고 있던 데이터가 소실되게 된다.
- 이를 방지하고자 한다면, savedStateHandle을 ViewModel에 선언해 사용하면 된다.(혹은 DB를 활용한다)
- savedStateHandle 사용 예는 아래를 참고하자 : https://developer.android.com/topic/libraries/architecture/viewmodel-savedstate
< 참고 >
'ANDROID > Performance' 카테고리의 다른 글
[안드로이드] include 태그를 사용하고 있다면? merge 태그로 레이아웃 계층 줄이기 (0) | 2020.10.07 |
---|---|
[안드로이드] 구글이 소개하는 메모리 최적화 기법들을 리뷰해보자 (0) | 2020.07.12 |
[안드로이드] 안드로이드 스튜디오의 Inspect Code로 프로젝트 자가진단하기 (0) | 2019.08.26 |
[안드로이드] 안드로이드 오버드로우 개선 - 레이아웃의 background를 확인하자 (0) | 2018.05.04 |
[안드로이드] 안드로이드 앱 메모리 최적화 - 이미지뷰 drawable 비우기 (0) | 2018.03.16 |