상세 컨텐츠

본문 제목

안드로이드 문서 정리 - 구성 변경 처리

카테고리 없음

by yebon.kim 2021. 4. 25. 11:58

본문

반응형

원문 링크

화면 방향, 키보드 가용성 등 configuration은 런타임에 변경될 수 있다. 이와 같은 변경이 일어날 경우 Android는 Activity를 재시작시킨다. (onDestroy -> onCreate) 때문에 변경된 configuration에 맞는 리소스를 다시 로드할 수 있다.

 

Activity가 재시작되기 때문에 이전의 상태를 유지시키는 것이 중요하다. onSaveInstanceState(), ViewModel 객체 및 영구적인 저장소 들을 활용하여 Activity UI 상태를 저장하고 복원할 수 있다.

 

애플리케이션 상태를 잘 유지하는지 확인하기 위해서 여러 작업을 하는 도중에 화면 방향 변경 등을 해보아야 한다. 상태에 대한 데이터를 저장하고 복원하는 비용이 많이 들고 사용자 환경이 나빠진다면 아래와 같은 방법을 시도해 볼 수 있다.

 

구성 변경 중 객체 보존 (Retain an object during a configuration change)

 

Activity를 재시작 할 때 많은 양의 데이터를 복구해야하거나, 네트워크 상태를 확인하고 재연결하며 집약적인 작업들을 처리를 하는 것이 요구될 경우, configuration 변경에 의한 재시작시 앱이 매우 느려져 사용자 경험이 나빠질 수 있다. 또 시스템이 Bundle과 onSaveInstanceState를 통해 Activity를 복구시키는 것은 완벽하지 않을 수 있다. 시스템은 이 작업에서 큰 객체들(Bitmap 등)을 다루도록 설계되어 있지 않다. 또 그 안의 데이터들은 메인 스레드에서 Serialize, deserialize 되기 때문에 이는 아주 많은 메모리를 소모하며 configuration change를 느리게 만들 수 있다. 이럴 때는 ViewModel 객체를 사용하면 Activity를 다시 초기화해야하는 부담을 덜 수 있다. ViewModel은 Configuration change가 되는 도중에도 데이터가 유지되기 때문에 UI데이터를 저장하기에 최적의 장소다.

 

 

구성 변경 직접 처리 (Handle the configuration change yourself)

 

이 방법은 권장하지 않는다. onSaveInstanceState(), ViewModels 및 영구적인 저장소를 사용하여 UI 상태를 보존할 수 없다면 특정 configuration 변경 중에 Activity가 재시작하지 않도록 막을 수 있다. 그 대신 Configuration이 변경될 시에 callback을 받을 수 있으므로 Activity를 수동으로 업데이트 할 수 있다. 이렇게 할 경우 configuration에 따른 대체 리소스를 사용하는 것이 까다로워질 수 있다. 때문에 구성 변경 직접 처리 방법은 최후의 수단으로 고려해야 한다.

 

Activity에서 configuration을 직접 처리하려면 AndroidManifest.xml 파일의 해당 <Acitivity> 요소에 android:configChanges 특성에 직접 처리하려는 구성을 선언해야한다. 사용가능한 값은 "orientation", "screenSize", "keyboardHidden"등이 있으며 다른 값들은 문서 에서 확인이 가능하다. 이와 같은 값들은 아래처럼 or(|) 문자로 구분하여 복수로 표기할 수 있다.

 

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

 

Configuration 객체 안에는 변경된 사항뿐만 아니라 현재 configuration에 대한 정보를 모두 가지고 있다. 하지만 대부분의 경우에는 변경된 구성에 대한 필드 값만 확인하면 된다. 이러한 필드 값은 문서 에서 확인할 수 있다.

 

위의 코드에 따르면 MyActivity는 화면 방향 전환과 키보드 가용성 configuration 변화에 의해서는 재시작하지 않게 된다. 그 대신 MyActivity안의 onConfigurationChanged() 콜백이 호출된다. 변경된 구성은 Configuration 객체로 전달되기 때문에 어떤 구성이 변경되었는지 확인하고 대응할 수 있다. 이 매서드가 호출되면 Activity의 Resources 객체가 업데이트 되어 새 Configuration에 대한 리소스를 반환하기 떄문에 UI 요소를 재설정할 수 있게 된다.

 

Configuration 객체 안에는 변경된 사항뿐만 아니라 현재 Configuration에 대한 정보를 모두 가지고 있다. 하지만 대부분의 경우에는 변경된 구성에 대한 필드 값만 확인하면 된다. 이러한 필드 값은 문서 에서 확인할 수 있다.

반응형

댓글 영역