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