안 드 로 이 드 개발 회전 화면 으로 인 한 Activity 재 구축 솔 루 션

안 드 로 이 드 개발 문서 에는 이 문 제 를 설명 하 는 소절 이 있다.쉽게 말 하면 Activity 는 사용자 와 의 상호작용 을 담당 하 는 가장 주요 한 메커니즘 으로 어떠한'설정'(Configuration)의 변화 도 Activity 의 인터페이스 에 영향 을 미 칠 수 있 으 며,이때 시스템 은 새로운 Configuration 을 반영 하기 위해 Activity 를 폐기 하고 재 구축 할 것 이다.'화면 방향'(orientation)은 Configuration 입 니 다.Configuration 류 의 javadoc 를 보면 fontScale,keyboard Hidden,locale 등 다른 Configuration 이 어떤 것 이 있 는 지 볼 수 있 습 니 다.화면 이 회전 할 때 이 Configuration 이 바 뀌 었 기 때문에 현재 표 시 된 Activity 는 재 구축 되 어야 합 니 다.Activity 대상 은 종 료 됩 니 다.onPause(),onStop(),onDestroy()방법 이 순서대로 실 행 된 다음 새로운 Activity 대상 이 생 성 되 고 onCreate()방법 이 실 행 됩 니 다.화면 이 회전 하기 전에 사용자 가 핸드폰 에 등록 양식 을 작성 하고 있다 고 가정 하면 잘못 처리 하면 사용 자 는 회전 후의 양식 이 공백 이 되 어 사용 체험 에 심각 한 영향 을 줄 수 있다.이 문 제 를 해결 하려 면 세 가지 방법 이 있다.방법 1:화면 회전 을 금지 하 는 것 은 의심 할 여지 가 없다.이것 은 가장 게 으 른 방법 이다.본 고 에서 제기 한 문 제 를 회피 하 는 것 과 같다.방법 은 다음 과 같다.
 
<activity android:name=".MyActivity"
android:screenOrientation="portrait"
android:label="@string/app_name">
방법 2:회전 한 후에 현장 을 회복 하 는 것 은 Activity 가 소 멸 될 것 이 므 로 우 리 는 앞에서 소개 한'지속 화/현장 복원'방법 으로 해결 할 수 있다.즉,onPause()에서 사용자 가 현재 입력 한 내용 을 데이터베이스 나 Preference 에 저장 하고 onCreate()방법 에서 폼 에 읽 고 채 우 는 것 도 공식 적 으로 추천 하 는 방법 입 니 다.보충 이 필요 합 니 다.Activity 재 구축 에 많은 자원 이 필요 하거나 네트워크 에 접근 해 야 하 는 시간 이 오래 걸 리 면 onRetainNonConfigurationInstance()방법 으로 필요 한 데 이 터 를 한 대상 에 저장 할 수 있 습 니 다.아래 와 같이
 
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
재 구축 시 onCreate()방법 에서 getLast NonConfigurationInstance()방법 으로 이전에 저 장 된 데 이 터 를 얻 을 수 있 습 니 다.다음 과 같은 방법:
 
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {// Configuration onCreate()
data = loadMyData();
}
...
}
방법 3:회전 을 수 동 으로 처리 하 는 일반적인 상황 에서 Configuration 의 변 화 는 Activity 를 소각 하고 재 구축 할 수 있 지만 지정 한 Configuration 을 변경 할 때 Activity 를 재 구축 하지 않 는 방법 도 있 습 니 다.방법 은 AndroidManifest.xml 에서 android:configChanges 속성 을 통 해 무시 해 야 할 Configuration 이름 을 지정 하 는 것 입 니 다.예 를 들 어 다음 과 같다.
 
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
이렇게 설정 한 후에 화면 이 회전 할 때 Activity 대상 은 소각 되 지 않 습 니 다.대신 Activity 의 onConfigurationChanged()방법 이 실 행 됩 니 다.여기 서 개발 자 는 현재 화면 방향 을 가 져 와 필요 한 것 을 할 수 있 습 니 다.이 경우 Activity 가 삭제 되 지 않 으 므 로 회전 하면 Activity 에 표 시 된 정보(예 를 들 어 텍스트 상자 에 있 는 텍스트)도 잃 어 버 리 지 않 습 니 다.만약 응용 프로그램 에서 가로 화면 과 세로 화면 이 같은 layot 자원 파일 을 사용한다 면,onConfigurationChanged()에 서 는 아무것도 하지 않 을 수도 있 습 니 다.그러나 가로 화면 과 세로 화면 이 서로 다른 layot 자원 파일 을 사용한다 면,예 를 들 어 가로 화면 은 res/layot-land/main.xml,세로 화면 은 res/layot-port/main.xml 를 사용 하고,onConfigurationChanged()에서 setContentView()방법 을 다시 호출 하여 새로운 layot 가 적 용 될 수 있 도록 해 야 합 니 다.이 때 Activity 대상 은 소각 되 지 않 았 지만,인터페이스의 각종 컨트롤 은 소각 되 어 재 구축 되 었 습 니 다.인터페이스 정 보 를 복구 하기 위해 서 는 추가 코드 를 써 야 합 니 다.
 
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);

// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, " ", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, " ", Toast.LENGTH_SHORT).show();
}
}
공식Android 개발 문서에 서 는 Configuration 변경 을 처리 하 는 것 을 권장 하지 않 습 니 다.참고:Using this attribute should be avoided and used only as a last-resort.Please read Handling Runtime Changes for more information about how to properly handle a restart due to a configuration change.회전 화면 을 고려 하 는 것 이 Activity 를 활성화 하 는 것 이 아 닙 니 다.재건 축 을 없 애 는 유일한 요 소 는 앞에서 소개 한 방법 을 추천 합 니 다.onPause()에서 Activity 상 태 를 지속 적 으로 유지 하고 onCreate()에서 현장 을 회복 하면 일거 수 일 투 족 을 할 수 있 습 니 다.Google 은 android:configChanges 속성 을 설정 하 는 방식 을 추천 하지 않 지만,Activity 가 같은 layot 파일 을 가로 세로 로 공유 하면 방법 3 이 가장 편리 합 니 다.

좋은 웹페이지 즐겨찾기