Gemstone's Devlog

ViewModel과 SIS(Saved Instance State) 본문

Kotlin (Android)

ViewModel과 SIS(Saved Instance State)

Gemstone 2022. 1. 17. 22:52

https://june0122.github.io/2021/05/13/android-bnr-04/

 

[Android] ViewModel과 SIS

ViewModel은 특정 액티비티 화면과 연동되며, 해당 화면에 보여줄 데이터를 형식화하는 로직을 두기 좋은 곳이다. ViewModel은 모델 객체와 연동되어 모델을 '장식한다'. 즉, 모델 데이터를 화면에 보

june0122.github.io

 

안드로이드 운영체제가 앱의 프로세스를 소멸시킬 때는 메모리에 있는 모든 액티비티들과 ViewModel들이 제거되지만,

액티비티나 ViewModel의 그 어떤 생명주기 콜백 함수도 호출하지 않는다.

 

그렇다면 액티비티가 소멸될 때 UI 상태 데이터를 보존해 액티비티의 재구성에 사용할 수 있는 방법은 무엇일까?

 

SIS(Saved Instance State, 저장된 인스턴스 상태) 에 데이터를 저장하는 것이 방법이 될 수 있다.

SIS는 안드로이드 운영체제가 일시적으로 액티비티 외부에 저장하는 데이터이며, 

Activity.onSaveInstanceState(Bundle)을 오버라이드해 SIS에 데이터를 추가할 수 있다.

 

액티비티가 '중단' 상태로 바뀔 때는(예를 들어, 사용자가 홈 버튼을 누른 후 다른 앱을 실행할 때) 언제든지 안드로이드 운영체제가 Activity.onSaveInstanceState(Bundle)을 호출한다. 중단된 액티비티는 종료 대상이 되므로 이때 시점이 중요하다. 

만일 우선순위가 낮은 백그라운드 앱이라서 앱의 프로세스가 종료된다면 Activity.onSaveInstanceState(Bundle)이 이미 호출되었다고 생각하면 된다.

 

액티비티의 슈퍼 클래스에 기본 구현된 onSaveInstanceState(Bundle)에서는 현재 액티비티의 모든 뷰가 자신들의 상태를 Bundle 객체의 데이터로 저장한다. 

 

Bundle은 문자열 키와 이 키의 값을 쌍으로 갖는 구조체다. onCreate(Bundle?)의 인자로 전달되는 Bundle 객체를 앞에서 이미 보았다.

 

override fun onCreate(savedInstanceState: Bundle?) {
	super.onCreate(savedInstanceState)
    ...
}

 

그리고 오버라이드한 onCreate(Bundle?)에서는 인자로 받은 Bundle 객체를 액티비티의 슈퍼클래스에 정의된 onCreate(Bundle?)에 전달해 호출한다. 그러면 슈퍼 클래스의 onCreate(Bundle?)에서는 인자로 받은 Bundle 객체에 저장된 뷰들의 상태 데이터를 사용해서 액티비티의 뷰 계층을 다시 생성한다.