안드로이드 디바이스는 0˚, 90˚, 270˚ 로 회전의 된다.
그리고 키보드를 열거나 닫을 때 역시 회전이 된다.
그런데 문제는 이때 액티비티가 onDestroy(), onCreate()를 수행하면서 액티비티가 가지고 있던 변수값과 쓰레드가 초기화되는 것이다. 이 초기화로 인하여 정상적으로 동작이 되는 경우도 있겠지만 오작동을 을으키는 경우가 생기기 때문에 이 값들을 유지 시킬 수 있도록 해주는 것이 필요하다.
1 2 3 4 5 6 7 8 9 10 11 | /** * 유지해야할 데이터가 한개라면 그 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; } |
1 2 3 4 5 6 7 8 9 10 | /** * onCreate()의 적당한 부분에 이전 데이터를 복원하는 코드를 넣어준다. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... restore(); // ... } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * 이전 데이터를 복원한다 */ @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"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * 회전과 프로그램 종료를 구분하여 처리하여 준다. */ @Override protected void onDestroy() { if(isFinishing()){ //isFinishing()은 진짜로 프로그램이 종료될때는 true 값이다. // 회전할때는 당연히 false worker.interrupt(); worker=null; } super.onDestroy(); } |