
안녕하세요! 👋
오늘은 Android에서 구성 변경시에 어떤 전략을 사용하면 좋을지에 대해서 가볍게 정리해보려 합니다!
화면 회전, 언어 변경, 다크/라이트모드 전환, 글꼴 크기 또는 두께 조정과 같은 앱 설정에 변경이 되는것을 말하며, 기본적으로 구성 변경이 일어날 경우 Activity 를 재시작하게 됩니다.
onSaveInstanceState 를 통해 Activity 재생성 전에 상태를 저장하고 onRestoreInstanceState 에서 해당 상태를 복원 할 수 있습니다.
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("input", editText.text.toString())
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
editText.setText(savedInstanceState.getString("input"))
}
ViewModel 객체는 Activity 의 생명 주기보더 길게 설계되었으므로, 구성 변경이 발생했을 때 데이터를 보존하고 다시 복원하는 데 이상적입니다.
rememberSavable 은 구성 변경 시에도 상태를 유지하여 remember 보다 더 넓은 범위에서 상태를 저장하고 복원합니다.Bundle 에 저장 할 수 있는 값에 한하여 자동으로 저장하고 복원하며 그렇지 못한 값의 경우에는 별도의 Saver 를 구현하여야 합니다.
@Composable
fun Foo() {
var count by remember { mutableIntStateOf(0) }
var savableCount by rememberSaveable { mutableIntStateOf(0) }
LaunchedEffect(Unit) {
while (true) {
delay(1.seconds)
count++
savableCount++
}
}
Text(text = count.toString()) // 화면 회전시 초기화
Text(text = savableCount.toString()) // 화면 회전시 유지됨
}
구성 변경 중에 리소스를 업데이트 할 필요가 없고, Activity 재시작을 피하고 싶다면, AndroidManifest 에서 Activity 가 처리할 구성 변경 사항을 android:configChanges 속성을 사용하여 선언할 수 있습니다. 선언 한 후에 onConfigurationChanged() 를 재정의하여 해당 변경 사항이 발생했을 때 수동으로 관리할 수 있습니다.
android:configChanges="orientation|keyboardHidden" // 화면 회전 , 키보드 접근성 변경
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 가로로 회전했음
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
// 세로로 회전했음
}
}
android:configChanges의 사용은 구성 변경의 책임을Activity로 넘기는 동작입니다. 주로 사용하는 경우는 게임 , 스트리밍 서비스와 같이 화면 재생성시에 큰 오버헤드가 발생하는 경우 구성 변경을 막고 필요한 부분만 수동으로 업데이트 할때 사용하는 전략입니다!
구성 변경은 안드로이드 앱 개발에서 자주 마주치지만, 매번 헷갈리거나 놓치기 쉬운 부분인것 같습니다! 저도 정리하면서 한번 더 숙지하게 되었는데요 상황에 따라 알맞은 전략을 사용하면 사용자 경험을 안정적으로 유지 할 수 있을것 같다고 생각했습니다. 😇
오늘 포스팅은 여기서 마치겠습니다.
이글이 여러분에게 도움이 되었으면 좋겠습니다.
오늘도 즐코하세요 🙇♂️
📚 Reference
Android Manifest Interview <저자: 엄재웅(skydoves)>