Activity 이동 시 데이터 저장 - 1) onSavedInstancestate

두리두두·2024년 5월 13일

Android

목록 보기
14/25
  • 액티비티를 이동할 때 데이터를 저장하는 방법은 크게 3가지가 있다.
  • ViewModel, savedInsanceState, storage

  • 그 중 먼저 savedInstance에 대해 알아보자.... 이전 글에 썼지만 사실 아리까리하여 따로 정리해본다.

호출 시기

  • 액티비티 생명주기의 어느 타이밍에 호출되는지 보기 위하여 생명주기 표를 또 꺼내본다.

  • 그나마 이해하기 좋은 짤을 뽀려왔다.. 보면 알겠지만 onsaveInstanceState는 onPause() 혹은 onStop() 이후에 호출되고, 저장된 데이터는  onCreate()onRestoreInstanceState()savedInstanceState 에서 불러 올 수 있다.

사용 방법

  • 저장하고 싶은 데이터를 onSavedInstanceState 콜백에 저장하고, onCreate에서 꺼내 쓰자!!
// onCreate(~)
 // 저장된 SavedInstanceState 값이 null이 아니면 그 배열값을 datas에 저장하자
  datas = savedInstanceState?.let {
            it.getStringArrayList("datas")?.toMutableList()
        } ?: let {
            mutableListOf<String>()
        }

// onSavedInstanceState
override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putStringArrayList("datas", ArrayList(datas))
    }

호출 시점 확인

  • 다음과 같이 투두를 세 개 등록했을 때 호출 순서를 확인해보았다.
  • 로그를 남긴 곳은
    1) B 액티비티에서 돌아왔을 때(ActivityResultLauncher)
    2) savedInstancestated를 확인해 datas를 갱신할 때
    3) onSavedInstanceState() 콜백이 호출됐을 때
    4) B 액티비티에서 저장 버튼을 누를 때
    네 가지이다.

  • 처음 B 액티비티로 가면 A가 pause되어 onSavedInstanceState가 호출된다. 당요니onSavedInstanceState는 빈 값이다. 그 후 B 액티비티에서 첫번째 투두를 작성 후 저장을 눌렀고, OnptionsItemSelected에 저장이 되었다.
  • 그러고 돌아와서 ActivityResultLauncher에서 getStringData로 B 액티비티에서 작성한 first todo가 기록되었다.
  • 그 후 다시 B 액티비티로 가자, A가 pause되며 onSavedInstanceState에 번들에 저장된 datas가 저장된다. 이제서야 onSavedInstanceState에 first todo가 저장된다. 그 후 second todo를 적어서 넘기면 ActivityResultLauncher에서 저장되어있던 datas에 추가로 저장을 한다.

정리

  • 결론적으로 내가 헷갈렸던 이유는,,, onSavedInstanceState가 액티비티가 시작할 때 호출된다st로 이해했던 것 때문같다.
  • onSavedInstanceState는 액티비티가 멈출 때 호출된다!! 이 때 이전 액티비티에서 받은 값을 bundle에 저장하는 것임.
  • 액티비티가 재실행될 때는 번들에 저장되어있던 데이터를 불러온 후 여기에 이전 액티비티에서 받은 값을 추가하고, 또 B 액티비티가 시작하면 onSavedInstanceState에 저장하는것!!
  • 화면 회전, 기기 퍼미션 등의 짧은 정보 저장에만 얘를 쓴다고 한다,, 그러므로 다음 글에서는 Viewmodel을 이용한 방법을 공부해보려한다. 이상

  • 참고
    https://ding-dong-in-future.tistory.com/258

profile
야금야금 앱 개발자

0개의 댓글