Bundle은 여러가지 타입의 값을 저장하는 Map클래스입니다. 예를 들면 String 값을 Bundle 클래스에 Mapping하는 것입니다. 기본타입인 int,double,long,String 부터 FloatArray,StringArrayList,Serializable, Parcelable까지 구현가능합니다.
Serializable(객체 직렬화)는 객체를 바이트로 저장하는 자바의 인터페이스이고 Parcelable는 안드로이드에서 만든 것 입니다.
클래스를 직렬화 하려면 클래스에 implements Serializable 또는 implements Parcelable을 하여야합니다.
하지만 Android에서는 Bundle을에 담아 Activity 간에 데이터를 주고 받을 때 Bundle 클래스를 사용하여 데이터를 전송합니다.
Activity에서 작동되는 onCreate(Bundle savedInstanceState) 에서 Application의 상태를 번들에 저장을 합니다. 예를 들어 화면이 세로모드에서 가로모드로 전환 시 onCreate함수가 다시 호출이되고 만약 전역변수를 설정하고 그 값을 유지하며 항상 사용해야 하는 경우라도 화면이 세로모드에서 가로모드로 변경할 경우 설정한 값들이 초기화 됩니다. 이런 경우 변경된 값을 유지하는데 onsaveInstanceState에 Bundle을 담아서 사용합니다.
Intent의 putExtra를 이용하여 다른 구성요소(Activity, Fragment)에 데이터를 전달할 수 있습니다.
public @NonNull Intent putExtra(String name,@Nullable String value) {
if(subExtra == null) {
subExtra = new Bundle();
}
subExtra.putString(name,value);
return this;
}
유지하고자 하는 데이터 저장
@Override
protected void onSaveInstanceState(Bundle outState) {
int currentTodoPosition = getCurrentTodoList().indexOf(currentTodo);
outState.putInt("currentCategoryPosition", currentCategoryPosition);
outState.putInt("currentTodoPosition", currentTodoPosition);
super.onSaveInstanceState(outState);
}
저장된 데이터를 onCreate에서 꺼내 사용하는 코드
if (savedInstanceState != null) {
currentCategoryPosition = savedInstanceState.getInt("currentCategoryPosition");
int currentTodoPosition = savedInstanceState.getInt("currentTodoPosition");
refreshTodoList();
if (currentTodoPosition != -1) {
currentTodo = getCurrentTodoList().get(currentTodoPosition);
}
}
값이 저장되어 있는 경우 saveInstanceState에서 값을 꺼내 씁니다.