Parcelable 및 번들

ParcelableBundle 객체의 용도는 IPC/바인더와 같은 프로세스 경계에서 사용됨 인텐트가 있는 활동 간 트랜잭션, 구성 전반에 걸쳐 일시적인 상태 저장 있습니다. 이 페이지에서는 다음을 사용하기 위한 추천 및 권장사항을 제공합니다. ParcelableBundle 객체

참고: Parcel는 범용이 아닙니다. 직렬화 메커니즘이 필요하며 디스크에 Parcel 데이터를 저장하거나 네트워크를 통해 전송합니다.

활동 간 데이터 전송

앱에서 사용할 Intent 객체를 만드는 경우 새 활동을 시작할 때 startActivity(android.content.Intent) 앱은 매개변수를 putExtra(java.lang.String, java.lang.String) 메서드를 사용하여 축소하도록 요청합니다.

다음 코드 스니펫은 이 작업을 실행하는 방법의 예를 보여줍니다.

Kotlin

val intent = Intent(this, MyActivity::class.java).apply {
    putExtra("media_id", "a1b2c3")
    // ...
}
startActivity(intent)

자바

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("media_id", "a1b2c3");
// ...
startActivity(intent);

OS는 인텐트의 기본 Bundle을 묶습니다. 그런 다음 OS는 새 활동을 데이터를 분리하고 인텐트를 새 활동에 전달합니다.

Bundle 클래스를 사용하여 OS에 알려진 프리미티브를 설정하는 것이 좋습니다. Intent 객체. Bundle 클래스는 parcel을 사용한 마샬링 및 언마샬링에 최적화되어 있습니다.

활동 간에 합성 또는 복합 객체를 전송하는 메커니즘이 필요한 상황도 있습니다. 이러한 경우 맞춤 클래스는 Parcelable을 구현하고 적절한 writeToParcel(android.os.Parcel, int) 메서드를 사용하여 지도 가장자리에 패딩을 추가할 수 있습니다. 또한 null이 아닌 CREATOR라는 필드도 제공해야 합니다. Parcelable.Creator 인터페이스를 구현합니다. <ph type="x-smartling-placeholder">createFromParcel()</ph> 메서드는 Parcel를 다시 현재 객체로 변환하는 데 사용됩니다. 자세한 내용은 Parcelable 객체에 관한 참조 문서를 확인하세요.

인텐트를 통해 데이터를 전송할 때 데이터 크기를 몇 KB로 제한해야 합니다. 너무 많은 데이터를 전송하면 시스템에서 TransactionTooLargeException 예외가 있습니다.

프로세스 간 데이터 전송

프로세스 간 데이터 전송은 활동 간 데이터 전송과 비슷합니다. 하지만 맞춤 parcelable을 사용하지 않는 것이 좋습니다. 맞춤 인벤토리나 Parcelable 객체를 한 앱에서 다른 앱으로 이동하는 경우 커스텀 클래스의 동일한 버전은 전송 및 수신 앱에 모두 있어야 합니다. 일반적으로 이는 일반적인 라이브러리일 수 있고 두 앱에서 모두 사용됩니다. 앱에서 맞춤 parcelable을 이는 시스템이 알지 못하는 클래스를 언마샬링할 수 없기 때문입니다.

예를 들어 앱은 AlarmManager 클래스, 맞춤 Parcelable 사용 설정합니다. 경보가 울리면 시스템이 인텐트의 Bundle의 보너스 콘텐츠 추가 반복할 수도 있습니다 이렇게 수정하면 시스템에서 맞춤 보너스 콘텐츠의 Parcelable입니다. 이렇게 제거하면 결과적으로 앱의 수정된 알람 인텐트를 수신할 때 비정상 종료됨 더 이상 존재하지 않는 추가 데이터를 수신합니다.

바인더 트랜잭션 버퍼의 고정 크기는 현재 1MB로 제한되며 이는 모든 사용자가 공유합니다. 진행 중인 트랜잭션이 있습니다 이 한도가 처리 중이므로 이러한 트랜잭션에는 onSaveInstanceState, startActivity 및 시스템과의 모든 상호작용 등. 크기가 한도를 초과하면 TransactionTooLargeException이 발생합니다.

savedInstanceState의 특정 사례의 경우 데이터 양을 작게 유지해야 합니다. 시스템 프로세스는 제공된 데이터를 사용자가 대기 상태로 유지하는 한 해당 Activity로 다시 이동할 수 있습니다 (활동의 프로세스가 종료되었더라도). 저장된 상태를 50k 미만의 데이터로 유지하는 것이 좋습니다.

참고: Android 7.0 (API 수준 24) 이상에서는 시스템에서 TransactionTooLargeException을 런타임 예외로 설정했습니다. 하위 버전의 Android에서는 시스템이 logcat에 경고만 표시합니다.