안드로이드 개발 화면 전환 할 때 Activity 삭제와 생성 방지 orientation, screenSize 속성 사용하기

 

환경: Android Studio

 

기본적으로 안드로이드는 가로에서 세로로 화면을 회전하게 되면 Activity 생명 주기가 다시 시작됩니다. 그 말은 기존 Activity 를 삭제하기 위해 onStop() -> onDestory() 가 실행되고 다시 onCreate() -> onStart() -> onResume() 시작된다는 의미입니다. 이것은 화면을 표현하기 위한 layout xml 이 가로와 세로에 별도로 부여 될 수 있기 때문입니다. 하지만 Activity 재생성이 필요 없는 경우가 있겠죠. 예를 들어 RTSP 로 서버에서 동영상을 다운 받아 표현하는 경우 화면 회전으로 인해 onCreate() 가 다시 실행되면 RTSP 서버로 다시 연결해야 하고 불필요한 로딩 시간이 걸리게 됩니다. 경우에 따라서 화면 회전을 하더라도 Activity 재생성을 막는 방법에 대해 알아 보겠습니다.

 

안드로이드의 생명 주기는 잘 알다시피 다음과 같습니다. Activity 가 재시작 된다면 onCreate() -> onStart() -> onResume() 이 다시 시작되겠죠.

안드로이드 개발 화면 전환 할 때 Activity 삭제와 생성 방지 orientation, screenSize 속성 사용하기

 

실제로 그렇게 되는지 로그를 찍어 보겠습니다. 그림과 같이 화면을 회전하게 되면 기존 Activity 는 삭제되고 다시 Create() 부터 생명주기가 시작됩니다. 예를 들어 인터넷 연결을 통해 영상을 받는 화면을 구현하고 있다면 화면 전환할 때 마다 다시 연결해서 다운받아야 하는 문제가 있습니다. 그리고 앱 성능도 떨어지겠죠

안드로이드 개발 화면 전환 할 때 Activity 삭제와 생성 방지 orientation, screenSize 속성 사용하기

 

이것을 막기 위해서는 AndroidManifest.xml Activity 속성 중에서 configChanges 를 수정해야 합니다. 안드로이드 아이스크림 샌드위치(4.0) 부터는 orientation 뿐만 아니라 screenSize 까지 추가해 줘야 합니다. 두 옵션 사이에 “|” Vertical Bar 는 여러 옵션을 중복해서 적용할 때 사용하는 특수 문자입니다

안드로이드 개발 화면 전환 할 때 Activity 삭제와 생성 방지 orientation, screenSize 속성 사용하기

 

이제 화면을 전환해도 더 이상 Activity 가 재생성 되지 않습니다. 그림처럼 기존에 연결한 영상을 그대로 유지하기 위해서는 반드시 configChanges=”orientation|screenSize” 를 설정하는 것이 좋습니다

안드로이드 개발 화면 전환 할 때 Activity 삭제와 생성 방지 orientation, screenSize 속성 사용하기

 

그런데 configChanges 에서 재생성을 막을 경우 가로와 세로 레이아웃이 변경되지 않는 문제가 있습니다. 그러니까 land 폴더에 있는 가로 xml 이 가로로 화면을 전환해도 적용이 안되고 세로모드 xml 로 유지 된다는 것이죠. 이런 문제를 해결하기 위해 모드가 변경되었을 때 실행되는 함수 onConfigurationChanged() Override 해서 다시 작성해야 합니다. Override/Implement 창에서 onConfigurationChanged() 을 클릭해서 함수를 생성합니다

안드로이드 개발 화면 전환 할 때 Activity 삭제와 생성 방지 orientation, screenSize 속성 사용하기

 

함수를 생성한 후 newConfig.orientation 를 분기문에 넣어서 가로와 세로를 구분합니다. 그리고 각 화면 별로 추가하고 삭제해야 할 내용을 이곳에 구현하시면 되겠죠

안드로이드 개발 화면 전환 할 때 Activity 삭제와 생성 방지 orientation, screenSize 속성 사용하기

저작자 표시 비영리 변경 금지
신고
Posted by 녹두장군


티스토리 툴바