IPC/바인더 트랜잭션과 같이 프로세스 경계를 넘는데 사용됨
인텐트를 통한 액티비티 사이, 설정 변경시 임시 상태를 저장하는데 쓰임
노트:
Parcel은 범용적인 직렬화 방식이 아니므로 디스크에 저장하거나 네트워크에 저장하지 마십시오.
Intent를 만들 때 putExtra() 메소드를 사용해 데이터를 전송할 수 있음Intent에 데이터를 추가하는 예시val intent = Intent(this, MyActivity::class.java).apply {
putExtra("media_id", "a1b2c3")
// ...
}
startActivity(intent)
운영체제는 인텐트의 기본 번들을 parcel화해 가지고 있다가 새 액티비티를 만들고 un-parcel해 새 액티비티로 넘김
번들 클래스는 parcel화 하기 매우 효율적임으로, 운영체제가 알고 있는 기본형 데이터를 번들로 만들어 인텐트에 담는 것을 권장함
기본형 외의 복잡한 객체를 전송할 필요가 있다면 클래스는 Parcelable을 상속받아야 하고, writeToParcel() 메소드를 구현해야 함, CREATOR라는 Parcelable.Creator 인터페이스를 구현한 필드도 제공해야 함, CREATOR는 createFromParcel()이라는 메소드를 통해 parcel을 원래 객체로 변환할 수 있음
인텐트를 통해 데이터를 전송할 때, 데이터 크기가 너무 크다면 TransactionTooLargeException 예외를 발생시킬 수 있음
액티비티 간 데이터 전송과 비슷하지만, 프로세스 간 데이터 전송시 사용자 지정 Parcelable을 사용하지 않는 것이 좋음, 사용해야 한다면 전송하는 앱들이 모두 같은 클래스를 사용해야 함
시스템은 모르는 클래스를 un-parcel할 수 없기 때문에 사용자 지정 Parcelable을 시스템에 전송하면 오류가 발생할 수 있음, 예를 들어 사용자 지정 Parcelable이 있는 알람 인텐트가 있을 때, 알람을 끄면 반복 횟수를 늘리기 위해 인텐트의 번들을 수정하고, 이 때 사용자 지정 Parcelable이 제거되어 앱이 다시 인텐트를 받았을 때 필요한 데이터가 삭제될 수 있음
바인더 트랜잭션 버퍼는 프로세스에서 일어나는 모든 트랜잭션들이 공유하는 1MB의 고정 크기로 제한됨, 용량 제한을 초과하면 TransactionTooLargeException 예외가 발생함
특히 savedInstanceState의 경우 저장되는 데이터의 용량을 작게 유지해야 함, 사용자가 액티비티로 다시 돌아왔을 때까지 시스템이 이 데이터를 유지해야 액티비티를 올바른 상태로 복원할 수 있기 때문, 50KB 이하로 저장하기를 권장함
원문: https://developer.android.com/guide/components/activities/parcelables-and-bundles