앱의 화면을 회전하게 되면 해당 액티비티내 onCreate()가 재호출되어 이미 저장했던 데이터들이 날아가는 이슈가 발생해 대개 화면모드를 세로 고정으로 하는 경우가 많습니다. 하지만 최근 태블릿을 이용하는 사람들이 많아지고 있기 때문에 화면회전을 허용 가능하게 개발 하려는분들도 많을 것입니다. 그래서 오늘은 '구성 변경 처리' 라는 간단한 개념을 통해 화면 회전 및 기타 구성 변경 이후 발생하는 이슈를 최소화 하기 위한 방법을 알아보도록 하겠습니다.
화면 회전이 발생 즉, 구성 변경이 발생하게 된다면 해당 액티비티에서는 onDestroy(), onCreate()를 호출함으로서 새로운 기기 구성에 앱이 적응할 수 있도록 시스템이 설계되어 있습니다. 여기서 재시작 이후에도 이전 상태를 복원하는 것이 핵심이라 할 수 있는데, 이에 따른 옵션은 크게 두가지가 있습니다.
- onSaveInstanceState()를 이용한 데이터 복원 : 해당 메소드를 구현하여 재시작 이후 호출하여 복원하는 방법입니다. 하지만 많은 양의 데이터를 복원해야한다면 해당 방법으로 구현하는데 있어 어려움을 겪을 수 있습니다.
- 구성 변경 직접 처리 : 해당 방법이 오늘 알아보고자하는 내용으로서, 앱을 재시작하지 않도록 하는 방법입니다.
사용법은 간단합니다. 매니페스트 파일의 <activity>내 요소 추가 및 해당 액티비티 소스에 onConfigurationChanged() 를 이용하면 간단하게 구현하실 수 있습니다.
<매니페스트 예시>
<activity
android:name=".MainActivity"
android:exported="false"
android:configChanges="orientation|screenSize" />
configChanges 속성을 통해 구성 변경을 직접 처리할 조건을 설정하면 되겠습니다. 해당 예시에서는 화면 회전 및 화면 크기 변경이 발생할 경우 재시작없이 구성 변경 처리됩니다. 이 두가지 조건 외에도 더 많은 조건이 있는데 자세한 사항은 아래 개발자 문서를 참고하시면 되겠습니다.https://developer.android.com/guide/topics/manifest/activity-element#config
Android 개발자 | Android Developers
애플리케이션의 시각적 사용자 인터페이스 일부를 구현하는 활동(Activity 서브클래스)을 선언합니다. 모든 활동은 매니페스트 파일의 {@code} 요소로 나타내야 합니다. 여기에 선언되지 않은 활동
developer.android.com
<액티비티 소스예시>
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (newConfig.orientation === Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show()
} else if (newConfig.orientation === Configuration.ORIENTATION_PORTRAIT) {
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show()
}
}
onConfigurationChanged() 를 이용하면 구성 변경에 따른 리소스 갱신이 가능합니다. 예를 들어 화면회전을 통해 가로모드로 진입할때 특정 UI를 수정해야한다면 이 메소드를 이용하면 구현하실 수 있습니다. 반면 리소스 수정 없이 유지만 해도된다면 해당 메소드를 꼭 구현하실 필요는 없습니다.
*주의점
오늘 소개시켜드린 방법은 개발자 문서에서 권장하지 않고 있습니다. 왜냐하면 기존 액티비티 life cycle를 무시하기 때문입니다..
해당 방법은 구성 변경으로 인해 재시작을 반드시 피해야할 경우, 최후의 수단으로 고려해야 합니다!
*참고
https://developer.android.com/guide/topics/resources/runtime-changes?hl=ko
구성 변경 처리 | Android 개발자 | Android Developers
구성 변경 처리 일부 기기 구성은 런타임에 변경될 수 있습니다(예: 화면 방향, 키보드 가용성 및 사용자가 다중 창 모드를 활성화할 경우). 그러한 변경이 일어나는 경우 Android는 실행 중인 Activi
developer.android.com
'Android' 카테고리의 다른 글
[안드로이드 / Kotlin] RecyclerView Drag&Drop / Swipe 구현 (0) | 2022.03.15 |
---|---|
[안드로이드 / Kotlin] 저전력 블루투스 BLE(3), 기기 연결 (0) | 2022.03.15 |
[안드로이드 / Kotlin] 저전력 블루투스 BLE(2), 스캔 (0) | 2022.02.28 |
[안드로이드 / Kotlin] 저전력 블루투스 BLE(1), BLE란? (0) | 2022.02.27 |
[안드로이드 / Kotlin] 진동 (0) | 2022.02.13 |