Bundle은 Map형태로 여러가지의 타입의 값을 저장하는 클래스 입니다. 아래의 Bundle.java 코드를 보면 여러 타입의 Object의 value를 String의 key로 저장하는 것을 알 수 있습니다. value값에는 Int, String과 같은 간단한 타입부터 Serializable, Parcelable 같은 복잡한 타입이 들어올 수 있습니다.
Serializable(객체 직렬화)는 객체를 바이트로 저장하는 자바의 인터페이스이고, Parcelable는 안드로이드에서 만든 것 입니다. 클래스를 직렬화 하려면, 클래스에 implements Serializable 또는 implements Parcelable을 해야합니다.
@Override
public void putObject(@Nullable String key, @Nullable Object value) {
if (value instanceof Byte) {
putByte(key, (Byte) value);
} else if (value instanceof Character) {
putChar(key, (Character) value);
} else if (value instanceof Short) {
putShort(key, (Short) value);
} else if (value instanceof Float) {
putFloat(key, (Float) value);
} else if (value instanceof CharSequence) {
putCharSequence(key, (CharSequence) value);
} else if (value instanceof Parcelable) {
putParcelable(key, (Parcelable) value);
} else if (value instanceof Size) {
putSize(key, (Size) value);
} else if (value instanceof SizeF) {
putSizeF(key, (SizeF) value);
} else if (value instanceof Parcelable[]) {
putParcelableArray(key, (Parcelable[]) value);
} else if (value instanceof ArrayList) {
putParcelableArrayList(key, (ArrayList) value);
} else if (value instanceof List) {
putParcelableList(key, (List) value);
} else if (value instanceof SparseArray) {
putSparseParcelableArray(key, (SparseArray) value);
} else if (value instanceof Serializable) {
putSerializable(key, (Serializable) value);
} else if (value instanceof byte[]) {
putByteArray(key, (byte[]) value);
} else if (value instanceof short[]) {
putShortArray(key, (short[]) value);
} else if (value instanceof char[]) {
putCharArray(key, (char[]) value);
} else if (value instanceof float[]) {
putFloatArray(key, (float[]) value);
} else if (value instanceof CharSequence[]) {
putCharSequenceArray(key, (CharSequence[]) value);
} else if (value instanceof Bundle) {
putBundle(key, (Bundle) value);
} else if (value instanceof Binder) {
putBinder(key, (Binder) value);
} else if (value instanceof IBinder) {
putIBinder(key, (IBinder) value);
} else {
super.putObject(key, value);
}
}
1. Android에서는 Activity간에 데이터를 주고 받을 때 Bundle 클래스를 사용하여 데이터를 전달 합니다.
Intent의 putExtra를 이용하여 다른 구성요소(Activity, Fragment 등)에 데이터를 전달 할 수 있습니다. 그런데 여기서 new Bundle 클래스가 생성되는 것을 볼 수 있습니다. 즉, Bundle로 데이터를 전송하는 것 입니다.
public @NonNull Intent putExtra(String name, @Nullable String value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putString(name, value);
return this;
}
링크를 통해 확인해보면 다양한 put, get 메서드를 확인 가능합니다.
https://developer.android.com/reference/android/os/Bundle
2. Activity의 상태 저장 및 복구(onSavedInstanceState, onRestoreInstanceState)를 할 때 쓰입니다.
Bundle은 데이터 저장 객체로 상태 저장 및 복구에 사용됩니다. Activity가 onStop()되기 전에 onSavedInstanceState에서 저장할 데이터를 저장시키며, onStart() 이후에 onRestoreInstanceState에서 복구시키게 됩니다.
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
val savedProject : Project? = savedInstanceState.getParcelable("project")
super.onRestoreInstanceState(savedInstanceState)
}