화면 회전시 액티비티(Activity) 생명주기
onSaveIntanceState()
일반적으로 onSaveInstanceState()가 호출되는 경우는 아래와 같다.
- 화면을 가로/세로 전환한 경우
- 시스템 메모리가 부족해 OS가 강제종료 시킨 경우
사용자가 뒤로가기(Back)버튼을 눌러 액티비티(Activity)를 종료한 한경우 또는 finish()와 같이 명시적으로 종료하는 경우는 호출되지 않는다.
1. onSaveInstanceState()를 통한 데이터 저장
액티비티(Activity)가 정지되기 시작하면 Bundle에 상태 정보를 저장할 수 있도록 시스템이 onSaveInstanceState() 메소드를 호출한다.
이 메소드는 기본적으로 EditText 위젯 내 입력했던 텍스트 또는 ListView 위젯의 스크롤 위치와 같이 Activity의 뷰 계층 구조에 대한 임시 정보를 저장한다. (단, onSaveInstanceState()를 Overide할 경우 상위클래스 구현(super)을 호출해야함)
하지만 TextView의 텍스트 같은 경우는 화면 회전시 다시 초기 text로 자동으로 바뀐다.
따라서 액티비티(Activity)의 추가적인 인스턴스 상태 정보를 저장하려면 onSaveInstanceState()를 재정의 하고, Bundle 객체에 데이터를 저장해야 한다.
2. onRestoreInstanceState()를 통한 데이터 복원
예상치 못한 상황으로 액티비티(Activity)가 소멸된 후 재생성되면, 시스템이 액티비티(Activity)에 전달하는 Bundle로부터 저장된 인스턴스 상태를 복구할 수 있다.
Bundle 객체를 복원할 때는 onCreate() 또는 onRestoreInstanceState()로 복원할 수 있다.
차이점으로는 onCreate()는 액티비티 생명주기로서 항상 호출되지만, onRestoreInstanceState()는 저장된 Bundle 객체가 있을 때만 호출 된다.
하지만, Bundle 객체는 소량의 데이터를 저장하는데 적합하다.
Bundle 객체는 메인스레드에서 직렬화되어야 하고 시스템 프로세스 메모리를 사용하기 때문이다.
대량의 데이터를 보존하기 위해서는 로컬 저장소(DB), onSaveInstanceState() 메소드, ViewModel 클래스로 복합적인 방법을 사용하여야 한다.
onSaveInstance() vs ViewModel
ViewModel
- 메모리에 데이터를 보관
- 복잡한 객체도 데이터 저장 가능
- 메모리에 데이터를 보관하기 때문에 UI 데이터를 빠르게 읽고 쓸 수 있음
- 메모리 부족 등의 액티비티 종료시 폐기됨 -> UI 상태 유지 X
onSaveInstanceState()
- 디스크에서 데이터 관리
- 원시(Primitive) 유형 및 문자열과 같은 단순하고 작은 객체만 저장 가능
- 직렬화/역직렬화 및 디스크 엑세스로 데이터 읽고 쓰기에 느림
- Bundle은 onSaveInstanceState()에서 데이터를 저장하는 과정 중 직렬화 과정을 거친다.
- 메인 쓰레드에서 동작하기 때문에 여기서 데이터를 저장하는데 시간을 많이 사용하게 되면 UI 버벅거림이 발생할 수 있다.
- 메모리 부족 등의 액티비티 종료 시 저장 가능 -> UI 상태 유지 O
'Android > Android 기초' 카테고리의 다른 글
[Android] 안드로이드 4대 컴포넌트(3) - 브로드캐스트(BroadCast) (0) | 2023.09.03 |
---|---|
[Android] 안드로이드 4대 컴포넌트(2) - 서비스(Service) (0) | 2023.09.03 |
[Android] 안드로이드 4대 컴포넌트(1) - Activity (0) | 2023.09.01 |
[Android] 안드로이드 구조와 동작 원리(2) - 구성 요소 및 빌드 과정 (0) | 2023.08.29 |
[Android] 안드로이드 구조와 동작원리 (1) - Android 플랫폼은 어떻게 생겼나? (0) | 2023.08.29 |