onSaveInstanceState 메서드 공부 기록

[공부 기록]

 

안드로이드 개발을 할 때 현재 사용 중인 데이터에 대한 관리가 중요하다.

뒤로가기 버튼, 사용자가 제작한 버튼을 클릭 시 사용 중인 데이터에 대한 관리가 가능하지만.

예기치 못한 상황에서 activity나 fragment가 종료되거나 전환되는 경우에는 불가능하다.

생명주기에 따른 데이터 처리도 가능하지만 onSaveInstanceState()라는 메소드로 더 편리한 기능을 제공한다.

아래 링크는 Save State에 관한 공식 문서이다.

 

프래그먼트로 상태 저장  |  Android 개발자  |  Android Developers

 

프래그먼트로 상태 저장  |  Android 개발자  |  Android Developers

프래그먼트로 상태 저장 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 다양한 Android 시스템 작업은 프래그먼트 상태에 영향을 미칠 수 있습니다. Android 프

developer.android.com

 

                                                                 작업                                               변수    뷰 상태  SavedState NonConfig

백 스택에 추가됨 x
구성 변경 x
프로세스 중단/재생성 x ✓*
백 스택에 추가되지 않고 삭제됨 x x x x
호스팅 완료됨 x x x x

 

SavedState : onSaveINstanceState()에 저장되는 인스턴스 고유 데이터 

 

*NonConfig 상태는 ViewModel의 저장된 상태 모듈로 프로세스 중단 시에도 유지 가능

 

SavedState는 직렬화된 데이터를 간편하고 쉽게 유지할 수 있도록 도와준다.

onSaveInstanceState() 메소드를 사용하면 액티비티나 프래그먼트가 종료되어도 데이터를 유지할 수 있다.

 

공식 문서를 따라서 직접 실습을 해봤다.

실습을 진행할 TestSaveInstanceState를 만들었다.

 

class TestSaveInstanceState : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_tets_save_instance_state)
    }

}

 

onSaveInstanceState를 Override 해준다.

 

 

Alt + Insert 후 Override Members 선택

 

간단한  코드를 작성했다.

Activity 상태 변환 시 onSaveInstanceState()가 호출되고 data에 기존의 textView의 데이터가 저장된다. 

그리고 outState를 통해서 key - value 형식으로 "key"  - "data"를 저장한다.

 

override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
    super.onSaveInstanceState(outState, outPersistentState)
    // 데이터 저장
    val data = textView.text.toString()
    outState.putString("Key",data)
}

 

onCreate에는 파라마터로 saveInstanceState가 있다.

만약 이 값이 null이 아니라면  key - value 형식의 데이터가 하나라도 있는 것이다.

텍스트뷰를 사용하다가 액티비티가 종료되었다면 기존에 작성하던 텍스트뷰의 데이터가 유지되어야 한다.

따라서 text 뷰에 이전에 저장한 key를 적용시켜 준다.

 

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_tets_save_instance_state)

    textView = findViewById<TextView>(R.id.test_text)

    // 데이터 불러오기
    if (savedInstanceState!=null){
        val data = savedInstanceState.getString("Key")
        textView.text = data
    }

 

데이터를 유지하는 방법을 알게 되었다.

onSaveInstanceState는 매우 편리하게 데이터를 관리할 수 있지만,

방대한 데이터를 다루기에는 무리가 있다.

이럴 때는 View Model을 사용하는 방법을 써야 한다.