ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SavedInsanceState가 저장되는 방식과 복원방식
    카테고리 없음 2024. 11. 5. 01:13
    SMALL

    SavedInstanceState는 메모리에만 저장되는 것이 아니라 안드로이드 시스템의 디스크 영역에도 임시로 저장됩니다.

    프로세스가 종료될 때의 동작 순서를 보면:

    // 1. 앱이 백그라운드로 가고 시스템이 프로세스 종료를 결정
    class MainActivity : AppCompatActivity() {
        override fun onSaveInstanceState(outState: Bundle) {
            super.onSaveInstanceState(outState)
            // 2. Bundle 데이터가 시스템의 디스크 영역에 저장됨
            outState.putString("key", "value")
        }
    }
    
    // 3. 프로세스 종료
    // 4. 나중에 앱 재시작시
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 5. 시스템이 디스크에서 Bundle 데이터를 읽어서 전달
        val restoredValue = savedInstanceState?.getString("key")
    }

    내부 구현을 보면:

    1. ActivityManager 서비스가 각 앱의 상태 정보를 관리
    2. 앱의 Bundle 데이터는 시스템의 /data/system/ 아래에 저장
    3. 각 앱의 SavedInstanceState는 고유한 식별자로 관리됨

    예를 들어:

    // 시스템이 내부적으로 관리하는 형태 (개념적 예시)
    data class SavedState(
        val activityId: String,  // 액티비티 식별자
        val userId: Int,         // 사용자 ID
        val bundle: Bundle       // 저장된 데이터
    )
    
    // 실제 저장 예시
    class MainActivity : AppCompatActivity() {
        override fun onSaveInstanceState(outState: Bundle) {
            super.onSaveInstanceState(outState)
            outState.putParcelable("state", ComplexState(
                data1 = "value1",
                data2 = 100
            ))
            // 시스템은 이 데이터를 디스크에 저장
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            // 시스템이 디스크에서 데이터를 복원
            savedInstanceState?.getParcelable<ComplexState>("state")?.let {
                // 상태 복원
            }
        }
    }

    그래서:

    1. 메모리상의 데이터는 프로세스 종료와 함께 사라지지만
    2. 시스템의 디스크에 저장된 데이터는 유지되고
    3. 앱 재시작시 시스템이 이 데이터를 다시 전달해주는 방식으로 동작합니다

    이는 ActivityManager 서비스가 관리하는 영구 저장소를 통해 이루어지며, 앱 개발자는 Bundle API를 통해 이 메커니즘을 간접적으로 사용하게 됩니다.

    LIST
Designed by Tistory.