상세 컨텐츠

본문 제목

앱 개발 방법 - 앱 리소스 (구성 변경 직접 처리)

안드로이드 프로그래밍/앱 리소스

by green post it 2022. 1. 8. 17:32

본문

반응형

구성 변경 직접 처리

애플리케이션이 특정 구성 변경 중에 리소스를 업데이트하지 않아도 되고 그와 동시에 성능 한계가 있어 액티비티를 다시 시작해서는 안 되는 경우 액티비티가 구성 변경을 알아서 처리한다고 선언하면 됩니다. 이렇게 하면 시스템이 액티비티를 다시 시작하지 않게 할 수 있습니다.

 

주의 : 구성 변경을 직접 처리하면 대체 리소스를 사용하는 것이 훨씬 더 까다로워질 수 있습니다. 시스템이 개발자 대신 자동으로 이를 적용해주지 않기 때문입니다. 이 기법은 구성 변경으로 인한 재시작을 반드시 피해야만 하는 경우 최후의 수단으로서만 고려해야 하며 대부분 애플리케이션에는 권장하지 않습니다.

 

액티비티가 구성 변경을 직접 처리하고 선언하려면 매니페스트 파일의 적절한 요소를 편집하고 처리하려는 구성을 나타내는 값이 있는 android:configChanges 특성을 포함하도록 합니다. 사용가능한 값은 android:configChanges 특성에 가장 많이 사용되는 값은 "orientation", "screenSize", "keyboardHidden"입니다.

 

"orientation" 값은 화면 방향이 변경될 때 다시 시작되지 않도록 합니다. "screenSize" 값도 방향이 변경될 때 앱이 다시 시작되지 않도록하지만 Android 3.2(API 레벨 13)부터 적용합니다. 앱에서 구성 변경을 수동으로 처리하고 싶다면 android:configChanges 특성에서 "orientation"과 "screenSize" 값을 선언해야 합니다.

 

"keyboardHidden" 값은 키보드 가용성이 변경되었을 때 앱이 다시 시작하지 못하도록합니다. 이 특성에는 여러 개의 구성 값을 선언할 수 있습니다. 각각을 파이프 문자( | ) 로 구분하면 됩니다.

 

예를 들어 다음 매니페스트 코드는 화면 방향 변경과 키보드 가용성 변경을 둘 다 처리하는 액티비티를 선언합니다.

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

이제 이러한 구성 중 하나가 변경되어도 MyActivity 는 다시 시작하지 않습니다. 그 대신 MyActivity 가 onConfigurationChanged()에 대한 호출을 받습니다. 이 메서드는 Configuration의 필드를 읽어보면 새 구성을 확인하고 적절히 변경할 수 있습니다.

 

그러려면 인터페이스에 사용된 리소스를 업데이트하면 됩니다. 이 메서드가 호출되면 액티비티의 Resources 객체가 업데이트되어 새 구성에 기반한 리소스를 반환하며 따라서 시스템이 액티비티를 다시 시작하지 않아도 UI의 요소를 손쉽게 재설정할 수 있게 됩니다.

 

예를 들어 다음의 onConfigurationChanged() 구현은 현재 기기의 방향을 확인합니다.

 

Java

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    //화면 방향 확인
    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();
    }
}

Kotlin

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)

    // Checks the orientation of the screen
    //화면 방향 확인
    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()
    }
}

 

Configuration 객체는 변경된 것뿐만 아니라 현재 구성 전체를 나타냅니다. 대부분의 경우 개발자는 구성이 정확히 어떻게 변경되었는지에는 관심이 없고 처리 중인 구성에 대한 리소스를 제공하는 모든 리소스를 단순히 재할당하기만 하면 됩니다.

 

예를 들어 이제 Resources 객체가 업데이트되었으므로 모든 ImageView를 setImageResource()로 재설정할 수 있으며 새 구성에 적합한 리소스가 사용됩니다. Configuration 필드에서 가져온 값이 Configuration 클래스에서 가져온 특정 상수와 일치하는 정수라는 점을 주의 깊게 보세요.

 

명심할점 : 액티비티가 직접 구성 변경을 처리한다고 선언하는 경우 대체를 제공하는 모든 요소에 대해 본인이 직접 책임을 지게 됩니다. 액티비티가 직접 방향 변경을 처리하고 가로 및 세로 방향 사이에서 바뀌어야 하는 이미지가 있는 경우 각 리소스를 각 요소에 재할당해야 하며 이를 onConfigurationChanged() 중에 수행해야 합니다.

 

이러한 구성 변경을 기반으로 애플리케이션을 업데이트하지 않아도 되는 경우 대신 onConfigurationged()를 구현하지 않아도 됩니다. 이런 경우 구성 변경 전에 쓰였던 리소스가 모두 그대로 사용되고 액티비티의 다시 시작만 피한 것이 됩니다. 그러나 애플리케이션은 언제든 종료되고 이전 상태를 그대로 유지한 채 다시 시작될 수 었어야 합니다.

 

정상적인 액티비티 수명 주기 중에 상태 유지에서 벗어나기 위한 방안으로 이 기법을 고려해서는 안 됩니다. 애플리케이션을 다시 시작할 수밖에 없는 다른 구성 변경이 있을 뿐만 아니라 사용자가 애플리케이션을 떠나면 해당 사용자가 다시 돌아오기 전에 상태를 소멸되는 등과 같은 이벤트를 처리해야 하기 때문입니다.

 

애플리케이션이 특정 구성 변경 중에 리소스를 업데이트하지 않아도 되고 그와 동시에 성능 한계가 있어 액티비티를 다시 시작해서는 안 되는 경우 액티비티가 구성 변경을 직접 처리한다고 선언하면 된다.이 기법은 구성 변경으로 인한 재시작을 반드시 피해야만 하는 경우 최후의 수단으로서만 고려해야한다.
반응형

관련글 더보기