Primary/Android

[Android Fundamentals] Activity - 9. Parcelables and bundles

해스끼 2024. 8. 7. 15:11

``Parcealble``과 ``Bundle``을 사용하면 프로세스 내/외부에 데이터를 전달할 수 있다. 이 글에서는 ``Parceable``과 ``Bundle``을 사용하는 best practices를 알아보자.

Activity 간 데이터 전송

Activity는 ``Intent``를 통해 시작할 수 있다. 이때 ``Intent.putExtra()``를 활용하면 activity에 데이터를 보낼 수 있다.

Intent(context, MainActivity::class.java).apply {
    putExtra("some key", "some data",)
}

 

넣을 수 있는 데이터는 Java primitive 타입과 String, 이 타입들의 array, 그리고 ``Bundle``이다.

많다

``Intent``에 추가된 extra 데이터는 OS가 ``Bundle`` 형태로 포장하고, 새 activity가 생성되면 포장을 풀어 activity에 전달한다.

 

보내고 싶은 데이터가 복잡한 경우에는 ``Parceable`` Parcel에 write하는 로직과 Parcel로부터 데이터를 read하는 로직을 직접 구현해야 한다. 자세한 내용은 ``Parcelable`` 문서에서 확인할 수 있다.

 

다만 intent를 통해 보낼 수 있는 데이터는 몇 KB 정도여야 한다. 데이터가 너무 크면 ``TranscationTooLargeException``이 발생한다.

프로세스 간 데이터 전송

Activity 전송과 비슷하다. 하지만 커스텀 parceable을 보내는 것은 권장되지 않는다. 커스텀 parceable을 다른 앱에 보내는 경우, 데이터를 보내는 앱과 받는 앱이 동일한 형태의 parceable을 알고 있어야 한다. 같은 라이브러리에 의존하면 되긴 한다.

 

하지만 수신 측이 모르는 parceable을 보내면, 수신 측에서 parceable을 포장 해제할 수 없으므로 에러가 발생한다.

 

예를 들어 ``AlarmManager``로 알람을 설정할 때, intent에 커스텀 parceable을 넣었다고 해 보자. 알람이 작동할 때 시스템은 알람 반복 횟수를 bundle에 추가하는데, 이때 커스텀 parceable이 없어질 수 있다. 그런데 앱은 intent가 시스템에 의해 수정됐다는 사실을 알지 못하기 때문에 원본 그대로의 커스텀 parceable을 얻으려 한다. 이 과정에서 크래시가 발생할 수 있다.

 

Binder transaction 버퍼의 크기는 대략 1MB 정도이다. 버퍼는 프로세스 단위로 공유되고, 다른 activity에서 저장한 instance state나 시스템과의 모든 상호작용 정보가 버퍼에 저장된다. 따라서 너무 큰 데이터를 저장하면 TransactionTooLargeException이 발생할 수 있다.

 

참고로 ``savedInstanceState``에는 데이터를 최소한으로 저장하는 것이 좋다. 사용자가 activity에 돌아올 때까지 state를 보존하고 있어야 하기 때문. 

참고자료

 

Parcelable 및 번들  |  Android Developers

Parcelable 및 번들은 IPC/바인더 트랜잭션과 같은 프로세스 경계 전반에서 인텐트가 있는 활동 간에 사용하고 구성 변경 시 일시적인 상태를 저장하기 위한 것입니다.

developer.android.com