위의 링크에 매우 간략하게 생명주기에 대한 설명을 적어 놓았다.
유저는 활동의 UI상태가 회전 또는 멀티 윈도우 모드로의 전환과 같은 구성 변경이 발생할 때 데이터의 변화가 일어나지 않게 하기 위해 어떻게 해야하는지에 대한 내용이다.
시스템이 구성 변경이 발생되면 Activity가 소멸되어 모든 UI 상태를 제거한다.
시스템 제약으로 Activity가 소멸되면 Viewmodel, onSaveInstanceState() 및 로컬 저장소에 데이터 저장 등 3가지 방법이 존재한다.
onSaveInstance() 메서드를 통해 원시 데이터나 간단한 객체와 같은 UI 데이터가 간단하고 가벼울 경우 onSaveInstanceState()만으로도 모든 구성 변경 및 시스템이 시작한 프로세스가 종료된 상황에서 UI 상태를 보존할 수 있다.
그러나 onSaveInstanceState()는 직렬화/역직렬화 비용을 발생하기 때문에 ViewModel과 onSaveInstanceState()를 같이 사용해야 함.
package com.twent.part1.chapter2
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
var number = 0
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val numberTextView = findViewById<TextView>(R.id.numberTextView)
val resetButton = findViewById<Button>(R.id.resetButton)
val plusButton = findViewById<Button>(R.id.plusButton)
resetButton.setOnClickListener {
number = 0
numberTextView.text = number.toString()
Log.d("onClick", "리셋 버튼이 클릭 됐습니다.")
}
plusButton.setOnClickListener {
number++
numberTextView.text = number.toString()
Log.d("onClick", "플러스 된 숫자 $number")
}
if(savedInstanceState != null)
{
number = savedInstanceState.getInt("number");
Log.d("savedInstanceState", "저장된 숫자 $number")
numberTextView.text = number.toString()
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
Log.d("savedInstanceState", "저장될 숫자 $number")
outState.putInt("number", number)
}
}
git : 예제코드 깃허브
위의 예시 코드는 숫자 세기 예제 코드로 화면이 회전해도 데이터가 그대로 보존되는 것을 확인할 수 있다.