본문 바로가기

프로그래밍/안드로이드(Android)

[Android] 화면 전환시 Activity 재생성 막기 (유용하게 사용하기)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Android 에서 가로 모드와 세로 모드를 지원한다.
다만 단점이라면 단점이고 유용하다면 유용한 문제가 있다.
바로 화면 전화시 마다 Activity의 onDestroy()와 onCreate()가 호출되면서 Activity가 재생성 되는 것이다.

화면 전환시에 onRetainNonConfigurationInstance() 가 불리며 여기서 화면전환시에 Object 값을 넘겨 줄 수 있다.
넘긴 Object는 onCreate()에서 getLastNonConfigurationInstance()를 통해 얻어 올 수 있다.


만약 getLastNonConfigurationInstance()에 아무 값도 넘겨 받지 못했다면 , 이는 화면 전환이 아닌 최초 Activity가
구동 되었다는 의미 이다.
그 후 onConfigurationChanged() 가 차례로 호출
된다.

onConfigurationChanged()에서는 가로 모드와 세로 모드 화면 전환시 이벤트를 받아 원하는 동작을 수행하도록 할 수 있다. 각 모드 마다 다른 동작을 수행 할 때 이 곳에서 처리 해주면 되겠다.
나중에 프로젝트간 유용하게 쓰일 부분이다.( 세로모드 웹툰 정보와 세로 웹툰제공 가로모드시 웹툰 정보 창은 사라지고 웹툰만 제공하는 기능을 구현할 예정이다.)

아무튼!! 화면전환시 Activity가 재생성되는 것을 어떻게 막을 것인가!?
위의 내용에 마춰서 화면전환시마다 현재 상태 정보를 저장하고 전환 후 정보를 다시 세팅해주는식으로 구현도 가능하긴 하다.
하지만 이는 재생성을 막는게 아니라 정보를 저장했다가 다시 넣어주는 방식 복잡하고 사이드도 많을 것같다.

맞다 아주 간단한 방법이 있다.
딱 한줄에 이를 해결 할 수 있다.

AndroidMenifest.xml 에서 Activity에 다음과 같이 넣기만 하면된다.

<activity android:name=".MainActivity"
         android:label="@string/app_name"

         android:configChanges="orientation|keyboardHidden" >

끝! 너무나 간단하지 않나?

앞서 설명할 필요 없이 android:configChanges="orientation|keyboard" 한줄로 해결 가능하다 ㅋ
해당 내용을 풀어보면 화면전환시에 변경되는 것들만 표시 해두는것 이라고 할까?
orientation 즉 수평 수직만 바꾸고 keyboard 의 상태만 바꾼다라는 의미?


물론 여기에 다른 값들도 추가 할 수 있다.

아래 develop 가이드인 정식 사이트를 참고 해보면 더 많은 정보를 얻을 수 있게 될 것이다.



마지막으로 요새 친구를 위해 셈플로 만들고 있는 어플에 해당 내용을 적용해 보았다.
처음 구동화면에서는 앞서 설명한 코드를 없에고 구동한 것이고, 뒤에 구동한 내용은 코드를 넣고 구동한 후 화면 전환을 한 모습이다.

확실히 차이가 느껴진다.



출처 : http://kkomanjell.tistory.com

정보 공유는 좋지만 불펌은 반대 합니다.