액티비티가 재활용(回收)된 후의 데이터 처리
액티비티가 정지 상태가 되면 시스템에 의해 재활용될 수 있습니다.
예를 들어, 액티비티 A에서 액티비티 B로 이동하면 액티비티 A는 정지 상태가 됩니다. 이때 메모리 부족 등으로 인해 시스템이 액티비티 A를 재활용했고, 사용자가 뒤로 가기 버튼을 눌러 액티비티 A로 돌아왔다고 가정해 봅니다.
이 경우 액티비티 A는 정상적으로 화면에 표시되지만, onRestart()가 호출되는 것이 아니라 onCreate()가 실행되며 액티비티 A가 새로 생성됩니다.
만약 액티비티 A에 임시 데이터(예: 텍스트 입력란에 사용자가 입력한 내용 등)가 있었다면, 재활용될 때 해당 데이터는 모두 사라지게 됩니다.
이런 상황이 앱에서 발생하면 사용자 경험에 큰 영향을 미치게 됩니다.
다행히도 액티비티에는 onSaveInstanceState()라는 콜백 메서드가 제공되며, 이 메서드는 액티비티가 재활용되기 전에 반드시 호출됩니다.
따라서 이를 활용하면 재활용 전의 임시 데이터를 보존할 수 있습니다.
onSaveInstanceState() 메서드는 Bundle 타입의 매개변수를 전달받습니다.
Bundle 클래스에는 데이터를 저장할 수 있는 여러 메서드가 있습니다. 예를 들어 문자열을 저장하는 putString()이나 정수를 저장하는 putInt() 등이 있습니다.
onSaveInstanceState 메서드 오버라이드
// 한국어
@Override
protected void onSaveInstanceState(Bundle outState) { // 이 메서드는 액티비티가 재활용되기 전에 호출됨
super.onSaveInstanceState(outState);
outState.putString("user_name", "판 양");
}Code language: JavaScript (javascript)
// 한국어
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate: ");
if (savedInstanceState != null) // onCreate에서 Bundle에 데이터가 있는지 확인할 수 있음. 데이터가 있다면 액티비티가 재활용된 후 다시 생성된 것임
{
Log.e(TAG, savedInstanceState.getString("user_name"));
}
}Code language: JavaScript (javascript)
재생성 시 Bundle 데이터 가져오기
onCreate 메서드에서는 시스템이 전달하는 Bundle 매개변수를 받습니다:
// 한국어
protected void onCreate(Bundle savedInstanceState) {Code language: JavaScript (javascript)
Bundle 데이터 가져오기
// 한국어
if (savedInstanceState != null) // onCreate에서 Bundle에 데이터가 있는지 확인할 수 있음. 데이터가 있다면 액티비티가 재활용된 후 다시 생성된 것임
{
Log.e(TAG, savedInstanceState.getString("user_name"));
}Code language: JavaScript (javascript)
액티비티 재활용
Previous: 액티비티의 생명주기
Next: 액티비티 실행 모드