Android Configuration

김성환·2024년 4월 21일

안드로이드에서 화면을 회전하며 액티비티가 초기화되는 경우가 있습니다. 이를 Android Configuration(구성변경)이라고 하는데 화면 회전, 키보드 가용성, 사용자가 다중창 모드등의 동작이 감지되면 Activity는 recreate됩니다. recreate를 야기시키는 Configuration의 특징은 레이아웃이 바뀌게되므로 액티비티 리소스를 다시 로드해야된다는것 입니다.

액티비티가 recreated되면 생명주기는 이렇습니다.

  • onSaveInstanceState(Bundle): 현재 화면 상태를 저장하여 다시 생성될 때 복원할 수 있습니다.
  • onPause()
  • onStop()
  • onDestroy()
  • onCreate(Bundle)
  • onStart()
  • onRestoreInstanceState(Bundle): 이전에 onSaveInstanceState(Bundle)에서 저장한 상태가 있는 경우 호출됩니다. 불러온 상태를 이용하여 이전 상태를 복원하고 활동을 이전 상태로 되돌립니다.
  • onResume()

화면의 데이터를 보존할수있는 방법은 onSaveInstanceState에서 번들을 사용하는것 말고도 Viewmodel에 데이터를 저장하거나 manifest의 android:configChanges속성을 사용하여 데이터를 보존할수 있습니다.


onSaveInstanceState,onRestoreInstanceState 적용

class MainActivity : AppCompatActivity() {
    private var counter = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 이전 상태 복원
        if (savedInstanceState != null) {
            counter = savedInstanceState.getInt("counter")
            updateCounterText()
        }

        // 버튼 클릭 시 카운터 증가
        incrementButton.setOnClickListener {
            counter++
            updateCounterText()
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        // 현재 카운터 값 저장
        outState.putInt("counter", counter)
        super.onSaveInstanceState(outState)
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        // 저장된 상태 복원
        counter = savedInstanceState.getInt("counter")
        updateCounterText()
    }

    private fun updateCounterText() {
        counterTextView.text = counter.toString()
    }
}

android:configChanges

<activity android:name=".MainActivity"
    android:label="@string/app_name"
    android:configChanges="orientation|screenSize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

구성 변경 시에 액티비티가 다시 생성되지 않고 시스템이 자동으로 처리되도록 할 수 있습니다
android:configChanges 속성은 다음과 같은 값들을 가질 수 있습니다:

  • orientation: 화면 회전에 대한 변경을 처리합니다.
  • screenSize: 화면 크기 변경(예: 태블릿과 스마트폰 간의 변경)을 처리합니다.
  • keyboardHidden: 키보드의 가용성 변경을 처리합니다(예: 키보드가 나타나거나 사라질 때).
  • locale: 언어 설정 변경을 처리합니다.
  • uiMode: 시스템 UI 모드 변경(예: 나이트 모드로 전환)을 처리합니다.
  • density: 화면 밀도 변경을 처리합니다.

reference
https://developer.android.com/reference/android/content/res/Configuration
https://medium.com/@rlatngus6663/android-configuration-%EA%B5%AC%EC%84%B1-%EB%B3%80%EA%B2%BD-beb25aa6ab30
https://happythingsmaker.wordpress.com/project-2/android-%EA%B5%AC%EA%B8%80%EC%9D%98-%EB%A9%94%EB%89%B4%EC%96%BC%EC%9D%84-%EB%B2%88%EC%97%AD%ED%95%98%EA%B8%B0/4-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0-%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8B%A4%EB%A3%A8%EA%B8%B0-0/4-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0-%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8B%A4%EB%A3%A8%EA%B8%B0-4-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0-recreate/

0개의 댓글