안드로이드는 디바이스가 매우 다른 하드웨어 구성에서도 가로 방향에서도 동작하도록 효율적으로 설계되었다. T-Mobile G1과 같은 일부 디바이스에서는 실행시에 하드웨어 구성을 변경할 수 있다. 예를 들어 키보드를 오픈 할 경우 화면은 세로 방향에서 가로 방향으로 변경된다.
안드로이드 어플리케이션의 쉬운 개발을 위해 안드로이드 시스템은 구성 변경 이벤트와 새로운 구성으로 현재 Activity를 자동으로 재실행한다. 이것은 사용자가 가로-세로 방향, 화면 크기, 로케일등에 기반한 drawable과 layout 같은 리소스를 선언할수 있도록 해준다.
![]() |
대안 리소스 프레임워크의 사용 가로-세로 방향에 특화된 리소스를 런타임에 플랫폼이 지원하는 것은 대안 리소스 프레임워크에 기반하고 있다. 가로-세로 방향에 특화된 리소스의 제공은 어플리케이션 개발에서 중요한 부분이다. 만약 리소스 디렉토리 수식 어구에 익숙하지 않거나 플랫폼이 그것들을 어떻게 사용하지는 알고 싶다면 다음의 링크를 읽어 보기 바란다. 교대 리소스 |
이러한 동작은 어플리케이션이 런타임때 디바이스의 구성에 자동으로 적응해야할 경우 정말 강력하다. 이것은 초보 안드로이드 개발자들이 왜 가끔 activity가 소멸되고 재 생성되는지를 혼란 스러워하는 이유이기도 하다.
이 "이슈"에 직면할때 몇몇 개발자들은 구성 변경을 직접 제어하려고 하나 이는 일반적으로 단기적인 해결 방안며 나중에는 문제를 더 복잡하게 만들게 된다. 반면 시스템의 자동화된 리소스 관리는 매우 효율적이며 사용자 인터페이스를 다양한 디바이스와 디바이스 구성에 적용할수 있는 쉬운 방법이다. 그러나 가끔 많은 대가를 치루어야 한다.
어플리케이션이 많은 데이터나 읽어 오기에 많은 비용이 소요되는 데이터를 디스플레이하고 있는 경우 자동적인 Activity의 소멸과 생성은 고통스러운 UX(user experience : 사용자 경험)를 야기할 것이다. 단순한 Flickr 브라우징 어플리케이션인 Photostream 의 예에서, 어플리케이션을 실행시키고 계정을 선택하면 어플리케이션은 (T-Mobile G1의)6개의 사진을 Flickr 서버로 부터 다운로드하고 화면에 디스플레이한다. UX를 향상 시키기 위해 어플리케이션은 조금 다른 레이아웃과 가로 세로 방향에서의 drawable을 사용한다. 결과는 아래와 같을 것이다.
Pohtostream은 안드로이드가 화면의 방향이 바뀔때 구성 변경을 다를수 있도록 해준다. 하지만 사용자가 모든 이미지를 다시 다운로드 받아야 한다고 생각해보자 얼마나 고통 럽겠는가. 이 문제의 명확한 해결책은 이미지를 임시로 캐쉬하는 것이다.(역자 주 : 엄청난 해결책이 있는줄 알았다. ㅜㅜ) 이미지는 어플리케이션 객체에서 혹은 정적 필드 등에서 (SD카드가 있다면)SD카드에 캐쉬될수 있다. 이 기술들중 어떤것도 현재 상황에 적용할수 없다. 왜 화면이 변경되지 않을때도 이미지를 캐싱하는 수고를 해야 하는가? 다행스럽게도 안드로이드는 이 목적에 딱 맞는 훌륭한 API를 제공한다.
Activity 클래스는 onRetainNonConfigutationInstance() 라는 특별한 메소드를 제공한다. 이 메서드는 개발자가 미래에 사용할 임의의 객체를 전달하기 위해 사용되고 안드로이드는 필요할때만 이 메소드를 호출할만큼 현명한다. Photostream의 경우, 이 메서드를 사용하는 어플리케이션은 다운로드한 이미지를 가로-세로가 변경될때 사용할 미래의 activity에게 전달한다. 구현 내용을 요약하면 아래와 같을 것이다.
새로운 Activity의 onCreate()에서 객체를 돌려 받기 위해 개발자가 해야할 것은 getLastNonConfigurationInstance() 를 호출하는 것이다. Photostream에서 이 메소드가 호출 되고 리턴되는 값이 null이 아니라면 이전 activity로부터 사진 목록이 로딩된다.
onRetainNonConfigurationChange()를 통해 객체를 전달할때 매우 주의해야한다. 전달하는 객체가 어떤 이유로 Activity/Context에 묶여 있을 경우, activity의 모든 뷰와 리소스는 누수될 것이다. (item 2. 메모리 누수 방지 참조) 이것은 view, drawable, adapter등은 절대 전달하지 말아야 한다는 것을 의미한다. 예를 들어 Photostream은 drawable로부터 bitmap을 추출하여 drawable이 아닌 bitmap만 전달한다. 결과적으로 onRetainNotConfigurationChange() 는 로딩하기에 매우 고비용의 데이터를 유지할때에만 사용되어야 하고 그렇지 않은 경우에는 안드로이드가 모든 것을 알아서 하도록 놔두는 것이 좋다.