[공부 기록]
안드로이드 개발을 할 때 현재 사용 중인 데이터에 대한 관리가 중요하다.
뒤로가기 버튼, 사용자가 제작한 버튼을 클릭 시 사용 중인 데이터에 대한 관리가 가능하지만.
예기치 못한 상황에서 activity나 fragment가 종료되거나 전환되는 경우에는 불가능하다.
생명주기에 따른 데이터 처리도 가능하지만 onSaveInstanceState()라는 메소드로 더 편리한 기능을 제공한다.
아래 링크는 Save State에 관한 공식 문서이다.
프래그먼트로 상태 저장 | Android 개발자 | Android Developers
작업 변수 뷰 상태 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 해준다.
간단한 코드를 작성했다.
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을 사용하는 방법을 써야 한다.