[개념] 안드로이드 Bundle(번들)로 Data 전달

쓰리원·2022년 5월 4일
0
post-thumbnail

1. Bundle의 개념

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);
        }
    }

2. Bundle의 활용

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)
}

3. reference

https://developer.android.com/reference/android/os/Bundle

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글