-
onSaveInstanceState개발/안드로이드 2019. 7. 15. 20:39
onCreate()와 onDestroy() 는 애플리케이션이 생성될 때와 종료 될 때 한 번씩만 불리는 콜백 함수로 알려져 있지만 디바이스의 설정 값이 갑자기 바뀌어 화면을 처음부터 새로 그려줘야 할 때도 불린다. 대표적으로 스마트폰을 회전 시키는 경우(rotate)가 이에 해당한다.
확인해보기 위해 테스트 애플리케이션의 콜백 함수들에 로그를 넣고 에뮬레이터(오레오 8.1) 에 설치한 후 오른쪽으로 회전 해봤다. onPause() 함수부터 불리는 부분이 회전 후에 나온 로그며 이중에는 onCreate()와 onDestroy()도 포함되어 있다.
onCreate()와 onDestroy() 함수가 다시 불린다는 뜻은 회전하기 전까지 설정해둔 변수 값들이 모두 초기화 된다는 것을 의미하기도 한다. 만약 애플리케이션 화면에 특정 값을 바꾼 상태로 회전을 했다면 처음 애플리케이션을 실행한 상태로 화면이 바뀌기 때문에 지금까지 작업한 것들이 모두 날라가게 된다.
안드로이드에선 이런 상황을 대처하기 위해 onSaveInstanceState(Bundle outState) 라는 콜백 함수를 뒀다. 이 함수는 모든 인자들이 초기화 되는 onDestroy() 함수 호출 전에 실행되며 함수의 인자에 key-value로 여러가지 데이터를 넣을 수 있다. 변경된 인자는 최종적으로 onCreate(Bundle savedInstanceState) 함수의 인자 값으로 전달 된다.
구구절절히 코드로 보는 것이 더 이해하기 쉬울 것 같다. 먼저 onSaveInstanceState 함수내에 아래와 같이 임의의 문자열 데이터 값을 입력했다.
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); logAndAppend("onSaveInstanceState"); outState.putString(SAVE_INSTANCE_KEY, "onSaveInstanceState is called!\n"); }
그리고 onCreate 함수에선 인자에 key 값이 저장되어 있는지 확인 한 후 있으면 그 값을 TextView에 표시하도록 했다.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLifecycleDisplay = (TextView) findViewById(R.id.tv_lifecycle_events_display); if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_INSTANCE_KEY)) { String savedString = savedInstanceState.getString(SAVE_INSTANCE_KEY); mLifecycleDisplay.setText(savedString); } logAndAppend(ON_CREATE); }
그 결과 아래와 같이 회전 후 TextView에 로그 메시지가 추가되는 것을 확인 할 수 있었다
'개발 > 안드로이드' 카테고리의 다른 글
RxJava - Observable, Observer (2) 2019.08.10 안드로이드 Loader (0) 2019.07.15 JAVA의 static (0) 2019.04.03 안드로이드 Service (0) 2019.03.19 AsyncTask (0) 2019.03.13