Android 액티비티의 상태 저장

timothy jeong·2021년 11월 12일
0

Android with Kotlin

목록 보기
37/69

일반적으로 액티비티가 종료되면 객체가 소멸하므로 액티비티의 데이터는 모두 사라진다. 그리고 다시 액티비티를 실행하면 초기 상태로 나온다. 그런데 액티비티가 종료될 때 유지해야 할 데이터를 저장했다가 다시 실행할 때 복원할 수 있을까?

액티비티가 종료되는 상황으로는 코드에서 finish() 함수를 호출하거나 사용자가 폰의 뒤로 가기 버튼을 누르거나 화면에 오랫동안 나오지 않아서 시스템에서 알아서 종료하는 상황이 대표적이다. 이런 상황에서는 액티비티를 다시 실행하더라도 초기 상태로 나오므로 굳이 상태를 저장했다가 복원할 필요는 없다.

상태를 저장한다는 것은 액티비티가 종료되어 메모리의 데이터가 사라지더라도 다시 실행할 때 사용자가 저장한 데이터로 액티비티의 상태를 복원하겠다는 의미이다. 대표적인 예가 화면을 회전할 때이다. 화면을 회전하면 액티비티가 종료되었다가 다시 나온다.

화면이 회전할때 onCreate() -> onStart() -> onResume() 까지 실행된 상태에서 화면을 회전하면 onPause() -> onStop() -> onSaveInstanceState() -> onDestroy() 까지 호출되고 액티비티는 종료된다.
이때 액티비티에서 발생한 모든 데이터는 사라진다. 그리고 다시 액티비티 객체가 자동으로 생성되어 onCreate() -> onStart() -> onRestoreInstanceState() -> onResume() 까지 호출되면서 화면에 액티비티가 출력된다.

만약 액티비티를 종료할 때 저장했다가 복원해야 할 데이터가 있다면 Bundle 이라는 객체에 담아 주면 된다. 다른 생명주기 함수는 매개변수를 가지지 않지만 onCreate(), onSaveInstanceState(), onRestoreInstanceState() 함수는 모두 Bundle 객체를 매개변수로 갖는다. 그러므로 이 객체를 이용해 데이터를 저장하고 복원할 수 있다.

onSaveInstanceState() 는 onStop() 함수 다음에 호출되므로 이 함수가 호출된다는 것은 액티비티가 종료됐다는 것을 의미한다. 그러므로 개발자가 onSaveInstanceState() 함수의 매개변수로 전달되는 Bundle에 데이터를 담아 주면 자동으로 데이터를 파일로 저장해준다.

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("data1", "hello")
        outState.putInt("data2", 10)
    }

번들에 데이터를 저장하라면 putString 등의 함수를 이용한다. 이렇게 저장하면 자체 캐싱 파일에 데이터를 저장해준다. 그리고 다시 액티비티가 생성되어 실행될 때 캐싱 파일이 있다면 그 내용을 읽어서 번들 객체에 담아 onCreate(), onRestoreInstanceState() 함수의 매개변수로 전달해 준다.

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        val data1 = savedInstanceState.getString("data1")
        val data2 = savedInstanceState.getInt("data2")
    }
profile
개발자

0개의 댓글