안드로이드폰은 화면 회전이 지원된다.
키보드를 열거나 닫으면 가로보기/세로보기로 전환이 되는데,
이때 UI가 새로 그려지면서 Activity의 onDestroy()와 onCreate() 가 수행된다.
위 과정이 수행되고 나면,
Activity 에서 가지고 있었던 변수들(field 도 포함)이 초기 상태로 된다.
만약, 코드에서 Thread를 만들어 돌아가는 중이었다면,
화면 회전을 한 후에는 사라지는 현상이다.
해결방법은 아래를 클릭...
[닫기...]
Activity소스코드를 보면, 타입이 HashMap<String, Object>이고, null 을 리턴하고 있다.
유지해야할 데이터가 한개라면 그 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의 적당한 부분에 이전 데이터를 복원하는 코드를 넣어준다.
여기에서는 restore() 를 따로 정의했다. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
...
restore();
...
...
}
/**
이전 데이터를 복원한다 */
@SuppressWarnings("unchecked")
private void restore() {
Object o = getLastNonConfigurationInstance();
if(o!=null){
//Map형태로 리턴했기때문에 casting 해서 사용한다.
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");
}
}
화면이 회전되거나 종료가 될때, onDestroy()가 호출되는데,
다음과 같이 구분해서 종료될때의 처리를 해 줄 수 있다.
protected void onDestroy() {
Log.d(tag, "onDestroy" + " isFinishing : " +isFinishing());
if(isFinishing()){
//isFinishing()은 진짜로 프로그램이 종료될때는 true 값이다.
// 회전할때는 당연히 false
worker.interrupt();
worker=null;
}
super.onDestroy();
}
[닫기...]
출처 : http://blog.kfmes.com/category/Android
'Android' 카테고리의 다른 글
[넥서스원] KT의 3G인터넷과 MMS설정을 위한 정보 (리셋시 필요합니다.) (0) | 2010.04.07 |
---|---|
setFilter를 사용한 EditText 길이제한 주기 (1) | 2010.04.06 |
가로,세로 모드 변경시 호출되는 함수 (0) | 2010.03.02 |
android 애러 대처법 : emulator: ERROR: bad config: virtual device directory lacks config.ini (0) | 2010.02.28 |
안드로이드 단말의 전화번호 받아오는 법 (0) | 2010.02.04 |