개발하는 두더지

[안드로이드] onSaveInstanceState(), onRestoreInstanceState() 로 액티비티 상태 저장 본문

Java,Android

[안드로이드] onSaveInstanceState(), onRestoreInstanceState() 로 액티비티 상태 저장

덜지 2019. 2. 20. 11:23

[안드로이드] onSaveInstanceState(), onRestoreInstanceState() 로 액티비티 상태 저장


화면전환의 경우 onPause() -> onStop() -> onDestory() 과정을 거쳐 액티비티가 종료되고 다시 onCreate() -> onStart() -> onResume() 과정으로 다시 실행이 됩니다. 이전 상태를 저장하지 않았기 때문에 이미 화면에 보여줬던 데이터는 사라지게 됩니다. 


onSaveInstanceState(), onRestoreInstanceState() 함수를 이용하여 Bundle로 데이터를 보관하고 다시 가져오면 데이터 유실을 막을 수 있습니다.

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}

위처럼 onSaveInstanceState는 파라미터를 1개, 2개 받는 함수로 나뉘어 있습니다. 파라미터를 2개받는 함수는 API 21에 추가되었는데 onPause() 다음에 무조껀 실행되지 않고 화면 전환 같은 상황이여서 액티비티가 종료되는 것인지 아닌지를 판단하여 실행을 시켜줍니다.

onPause() -> onSaveInstanceState() -> onStop() -> onDestory() 



@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
}

파라미터 1개짜리 onRestoreInstanceState 는 화면이 회전하면 무조껀 호출되지만 파라미터 2개짜리는 Bundle에 값이 없으면 호출되지 않습니다.

onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()



EditText의 경우 초기 안드로이드에선 화면 회전시 데이터가 사라졌지만 지금은 내부에서 데이터를 유지했다가 다시 정상적으로 데이터를 가져오는 기능이 내장되어있기 때문에 데이터 유실에 대한 처리를 할 필요는 없습니다.


책을 다시 보면서 정리하다가 파라미터 2개짜리는 몰랐던 내용이라 정리하는 중이였는데 최근에 사용한 LiveData를 보면 옵저버 패턴으로 생명주기에 맞게 데이터를 보내고 받으며 화면 회전과 같은 상태 변화에도 유연하게 대처할 수 있기때문에  LiveData 쓰는 것이 훨씬 좋은 것 같습니다. 





Comments