퉁탕퉁탕 만들어보자

Activity 화면 전환 시 onConfigurationChanged에서 처리하기 본문

Computer/Android

Activity 화면 전환 시 onConfigurationChanged에서 처리하기

호숀티 2022. 4. 10. 22:46
반응형

화면을 회전하자 activity가 죽었다가 재시작을 하게된다.

어떻게 하면 Activity가 onDestroy -> onCreate하며 재시작하지 않게 할 수 있을까?

 

화면 orientation(세로/가로) 변경 시 configuration이 change되었을 때 activity는 destory -> create가 되는 것은 resource를 다시 로드해서 올바르게 화면을 표시하게 할 수 있도록 framework가 의도한 동작이다. 

 

보통 layout파일을 layout-land, layout-port 두가지로 파일을 유지한다.

하지만 layout이 거의 비슷하면 파일 두개로 쓰지않고 하나로 쓰면서, 달라지는 부분만 dimen값을 values-land 에만 따로 정의한다. 

--> 이렇게 사용하면 재시작이 필요하다

 

하지만 리소스 업데이트 없이 java코드에서 직접! 가로/세로 layout 길이 등등을 변경하고자한다면 매니페스트 파일에서 configChanges되었을때 재시작되지 않게 하는 옵션을 추가해준다.

 

AndroidManifest.xml

<activity
	android:name=".PolicyActivity"
	android:configChanges="orientation"|"screenSize"|"screenLayout">
</activity>

 

* 주의! 애플리케이션이 Android 3.2(API 레벨 13) 이상을 대상으로 하는 경우 "screenLayout"및 "screenSize"구성도 선언필요. 이는 장치가 세로 및 가로 방향으로 전환될 때 화면 레이아웃과 화면 크기가 변경될 수 있기 때문입니다.

 

참고: https://developer.android.com/guide/topics/manifest/activity-element#config

 

이렇게 하면 Activity가 재시작되지 않는다. 대신 onConfigurationChaged()라는 콜백이 불리게 되고, 

우리가 onConfigurationChanged()를 override하여 해당 config의 변경시 처리해줄 내용들을 직접 처리하면 된다.

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

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // 가로일때 직접 textview의 width 변경
        ViewGroup.LayoutParams params = mTextView.getLayoutParams();
        params.width = getResoureces().getDimensionPixelSize(R.dimen.text_width);
        mTextView.setLayoutParams(params);
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // 세로일때 처리
    }
}

 

장점은, 잦은 회전에도 메모리 사용이 절약된다. Activity가 재시작된다고 해서 기존 instance가 바로 메모리에서 삭제되지는 않기 때문이다.

 

하지만 개인적으로는 onConfigurationChanged는 남용하지 않고 꼭 필요한경우에만 사용하는것을 추천한다.

resource처리가 까다롭기 때문에 대체로 재시작하는게 나은 경우가 많다.

 

 

화면 전환말고도 다양한 config change 는 다음을 참고하도록 한다.

https://developer.android.com/guide/topics/manifest/activity-element#config

728x90
반응형