안드로이드에서 객체를 직렬화하여 전달하는 방법에는 Parcelable를 더 간단하게 객체를 직렬화하는 방법이 있는데 Bundle
이라고 합니다 새로운 activity를 실행하게 될때나 서비스를 실행할때 intent putExtra 메서드를 사용하여 매개변수를 전달하는 방법을 사용하였던 적이 있습니다.
이때 intent의 bundle을 묶어서 activity를 생성할때 bundle을 풀어 새 activity에 전달하게 됩니다. 이때 intent객체에 OS에게 primitive한 object 설정하는 것이 좋습니다. bundle은 Parcel을 사용하는 직렬화 객체를 전달하는데에 사용됩니다.
public final class Bundle extends BaseBundle implements Cloneable, Parcelable { .. }
Parcelable
을 implements 받아 구현되어 있는 객체 직렬화 클래스 입니다
내부적으로 Parcelable 을 사용하여 직렬화를 하는데 Parcel 객체를 이용하는데 Parcel은 Serializable
을 사용하여 직렬화를 하고 있습니다.
Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a non-null static field called CREATOR of a type that implements the Parcelable.Creator interface
Parcel을 쓰고 저장하기 위해서 사용될수 있는 인스턴스들을 위한 인터페이스입니다. non-null static field인 Parcable.Creator 인터페이스를 항상 implement해야 합니다.
// Parcel의 내용을 기술. 실제로는 잘 사용하지 않음
public int describeContents()
// Parcel을 un-marshalling 할때 쓸 순서
public void writeToParcel(Parcel dest, int flags)
public interface Creator<T> {
// Parcel이 된 Parcelable class 데이터 저장
public T createFromParcel(Parcel source);
// Parcel.createTypeArray() 함수 호출시 사용됨
public T[] newArray(int size);
}
Parcel은 Serializable을 implements 하는 HashMap을 사용하고 있기도 합니다.
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable { .. }
val intent = Intent(this, MyActivity::class.java).apply {
putExtra("media_id", "a1b2c3")
// ...
}
startActivity(intent)
activity#onSaveInstanceState(bundle)
쉽게 직렬화 된 데이터를 유지하게 할 수 있습니다.
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(IS_EDITING_KEY, isEditing)
outState.putString(RANDOM_GOOD_DEED_KEY, randomGoodDeed)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
isEditing = savedInstanceState?.getBoolean(IS_EDITING_KEY, false)
randomGoodDeed = savedInstanceState?.getString(RANDOM_GOOD_DEED_KEY)
?: viewModel.generateRandomGoodDeed()
}
fragment에서는 activity와 비슷하게 onCreate(Bundle), onCreateView(LayoutInflater, ViewGroup, Bundle), onViewCreated(View, Bundle) 에서 사용 할 수 있습니다.