퉁탕퉁탕 만들어보자

onSaveInstanceState 는 어떻게 사용하지? 본문

Computer/Android

onSaveInstanceState 는 어떻게 사용하지?

호숀티 2022. 4. 15. 00:27
반응형

 맨 처음 Activity를 만들면 onCreate()의 인수로 savedInstanceState가 넘어오는것을 보고 이건 무엇일까? 생각하게된다.

override fun onCreate(savedInstanceState: Bundle?)

 

Framework는 Activity가 예상치 못하게 종료되는 경우를 대비해서 onSaveInstanceState를 호출해줘서 이때 여기서 필요한 정보를 저장하고, Acticity가 재시작될 때 이때 저장된 bundle을 onCreate 또는 onRestoreInstanceState 에서 처리를 해줄수 있게 해준다.

 

그러면 onSaveInstanceState가 언제 불리는지를 알아야한다.

바로바로 Activity가 정지될때 불린다. 하지만 user가 Activity를 명시적으로 끝낼때는 불리지 않는다. - 백키 종료랑, finish() 함수를 통해서 destory될 때다. 생명주기 callback들 간의 순서는 targetSdkVersion에 따라 다른데, 11미만에서는 onPause()이전이고 그 이상에서는 onStop()전에 불린다.

 

그러면 bundle에는 무엇을 저장할까?

좀 중요하고 영구적으로 남겨야되는 data들은 db나 sharedpreference를 이용해서 onStop에서 저장을 처리해주고

간단한 ui 정보들을 bundle로 키-밸류 쌍으로 저장해서 활용한다.

 

예제) onSaveInstanceState를 활용해서 data저장하기

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.run {
        putInt(STATE_SCORE, currentScore)
        putInt(STATE_LEVEL, currentLevel)
    }
    super.onSaveInstanceState(outState)
}

companion object {
    val STATE_SCORE = "playerScore"
    val STATE_LEVEL = "playerLevel"
}

 

예제) onCreate에서 savedInstanceState처리하기

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

	// saveInstanceState는 null일 수 있다. 있을때만 처리해준다.
    if (savedInstanceState != null) {
        with(savedInstanceState) {
            // 값 복원해주기
            currentScore = getInt(STATE_SCORE)
            currentLevel = getInt(STATE_LEVEL)
        }
    } else {
        //새로운 instance에서 필요한 initialize작업을 수행한다
    }
}

 

onCreate대신에 onRestoreInstanceState에서 처리도 가능하다. 순서는 onStart 다음에 불린다. 또한 Bundle이 반드시 있을때만 불리니까 onRestoreInstanceState에서 처리하는게 좀더 깔끔할수 있겠다.

override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
    super.onRestoreInstanceState(savedInstanceState)

    // 값 복원해주기
    savedInstanceState?.run {
        currentScore = getInt(STATE_SCORE)
        currentLevel = getInt(STATE_LEVEL)
    }
}

 

*만약 Activity가 탑에 있지 않은경우에도 onSavedInstanceState가 불릴까? 그렇지않다. 이미 위에 누군가 올라가서 덮이게 될때 onSavedInstanceState가 이미 불리게 된다. 홈버튼이나 화면꺼짐, 화면회전이 일어나면 제일 위에 있는 Activity에서만 onSavedInstanceState가 불리게 된다.

728x90
반응형