본문 바로가기
X

앱 개발 방법 - 앱 리소스 (구성 변경 처리, 구성 변경 중 객체 보존)

by green post it 2022. 1. 8.
반응형

구성 변경 처리

일부 기기 구성은 런타임에 변경될 수 있습니다.(예:화면 방향, 키보드 가용성 및 사용자가 다중 창 모드를 활성화할 경우) 그러한 변경이 일어나는 경우 Android는 실행 중인 Activity를 다시 시작합니다.(onDestroy()가 호출되고 그다음에 onCreate()가 호출됨) 재시작 동작은 여러분이 제공한 대체 리소스로 애플리케이션을 자동으로 다시 로드함으로써 새로운 기기 구성에 애플리케이션이 적응하는 것을 돕도록 설계되었습니다.(예:다양한 화면 방향과 크기에 대한 다양한 레이아웃)

 

재시작을 적절히 처리할 때는 액티비티가 이전 상태로 복원되는 것이 중요합니다.

onSaveInstanceState(), ViewModel 객체 및 영구적인 저장소 조합을 사용하여 모든 구성 변경에 걸쳐 액티비티의 UI 상태를 저장하고 복원할 수 있습니다.

 

애플리케이션이 애플리케이션 상태를 그대로 유지한 채 스스로 다시 시작할 수 있는지 시험해 보려면 애플리케이션에서 여러 가지 작업을 수행하는 동안 구성 변경을 실행해보아야 합니다.(예를 들어 화면 방향 변경 등) 언제든 애플리케이션이 사용자 데이터나 상태를 손실하지 않고 다시 시작할 수 있어야 합니다.

 

그래야 구성 변경과 같은 이벤트를 처리할 수 있기 때문입니다. 그렇지 않으면 걸려오는 전화를 받은 사용자가 한참 뒤에 애플리케이션으로 돌아왔을 때 애플리케이션 프로세스가 이미 소멸되어 있을 수도 있습니다.

 

하지만 애플리케이션을 다시 시작하고 상당량의 데이터를 복원하면 비용도 많이 들고 미흡한 사용자 환경이 만들어지는 상황에 직면할 수도 있습니다. 그러한 상황이라면 두 가지 다른 옵션이 있습니다.

 

1. 구성 변경 중 객체 보존

구성이 변경되는 중에 액티비티가 다시 시작될 수 있게 허용하되 액티비티의 새 인스턴스에 상태 저장 객체를 넣습니다.

 

2. 구성 변경 직접 처리

구성 변경을 처리할 때 숨겨진 복잡성이 있기 때문에 직접 구성 변경을 처리하는 것은 권장하지 않습니다. 그러나 선호하는 옵션(onSaveInstanceState(),ViewModels 및 영구적인 저장소)을 사용하여 UI 상태를 보존할 수 없다면 특정 구성 변경 중에는 시스템에서 액티비티를 다시 시작하지 못하도록 차단할 수 있습니다. 구성이 변경될 때 앱에서 콜백을 받으므로 필요에 따라 액비티비를 수동으로 업데이트할 수 있습니다.

구성 변경 중 객체 보존

액티비티를 다시 시작하기 위해 많은 수의 데이터 세트를 복구해야 하는 경우 네트워크 연결을 다시 설정하거나 다른 집약적 작업을 수행한 다음 완전히 다시 시작하세요. 구성 변경 때문에 사용자 환경이 느려질 수 있습니다. 또한 시스템이 onSaveInstanceState() 콜백을 사용하여 개발자 대신 저장하는 Bundle을 사용하여 액티비티 상태를 완전히 복원하지 못할 수 있습니다.

 

이는 대형 객체(예:비트맵)를 담도록 디자인된 것이 아니며 이 안의 데이터는 반드시 직렬화했다가 메인 스레드에서 다시 역직렬화해야 합니다. 이렇게 하면 메모리를 아주 많이 소모할 수 있으며 구성 변경이 느려질 수 있습니다. 이런 경우에는 ViewModel 객체를 사용하여 액티비티의 일부를 다시 초기화하는 부담을 완화할 수 있습니다. ViewModels는 모든 구성 변경에서 보존되므로 UI 데이터를 다시 쿼리 할 필요 없이 보관하기에 좋은 위치입니다.

 

onSaveInstanceState(), ViewModel 객체 및 영구적인 저장소 조합을 사용하여 모든 구성 변경에 걸쳐 액티비티의 UI 상태를 저장하고 복원할 수 있다.
애플리케이션이 애플리케이션 상태를 그대로 유지한 채 스스로 다시 시작할 수 있는지 시험해봐야한다. 그래야 구성 변경과 같은 이벤트를 처리할 수 있기 때문이다.

 

 

반응형