안드로이드 디바이스는 0˚, 90˚, 270˚ 로 회전의 된다.

그리고 키보드를 열거나 닫을 때 역시 회전이 된다.


그런데 문제는 이때 액티비티가 onDestroy(), onCreate()를 수행하면서 액티비티가 가지고 있던 변수값과 쓰레드가 초기화되는 것이다. 이 초기화로 인하여 정상적으로 동작이 되는 경우도 있겠지만 오작동을 을으키는 경우가 생기기 때문에 이 값들을 유지 시킬 수 있도록 해주는 것이 필요하다.



/** 
 * 유지해야할 데이터가 한개라면 그 Object를 바로 리턴해도 된다.
 */
@Override
public Object onRetainNonConfigurationInstance() {
    HashMap< String, Object > map = new HashMap< String, Object >();
    map.put("worker", worker);
    map.put("var1", var1);
    map.put("var2", var2);
    return map;
}


/**
 * onCreate()의 적당한 부분에 이전 데이터를 복원하는 코드를 넣어준다.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    restore();
    // ...
}


/**
 * 이전 데이터를 복원한다
 */
@SuppressWarnings("unchecked")
private void restore() {
    Object o = getLastNonConfigurationInstance();
    if(o!=null){
        HashMap< String, Object >map = (HashMap< String, Object >) o;
        this.worker = (Thread) map.get("worker");
        this.var1 = (String) map.get("var1");
        this.var2 = (String) map.get("var2");
    }
}


/**
 * 회전과 프로그램 종료를 구분하여 처리하여 준다.
 */
@Override
protected void onDestroy() {
    if(isFinishing()){
        //isFinishing()은 진짜로 프로그램이 종료될때는 true 값이다.
        // 회전할때는 당연히 false
        worker.interrupt();
        worker=null;
    }
    super.onDestroy();
}

출처 : http://blog.kfmes.com/227
저작자 표시 비영리 변경 금지
신고

+ Recent posts