พาร์เซลและกลุ่ม

ออบเจ็กต์ Parcelable และ Bundle มีไว้เพื่อใช้ในขอบเขตของกระบวนการ เช่น การทำธุรกรรม IPC/Binder ระหว่างกิจกรรมที่มี Intent และเพื่อจัดเก็บสถานะชั่วคราวเมื่อมีการเปลี่ยนแปลงการกำหนดค่า หน้านี้มีคำแนะนำและแนวทางปฏิบัติแนะนำสำหรับการใช้ออบเจ็กต์ ParcelableและBundle

หมายเหตุ: Parcel ไม่ใช่กลไกการซีเรียลไลซ์แบบอเนกประสงค์ และคุณไม่ควรจัดเก็บข้อมูล Parcel ใดๆ ไว้ในดิสก์หรือส่งผ่านเครือข่าย

การส่งข้อมูลระหว่างกิจกรรม

เมื่อแอปสร้างออบเจ็กต์ Intent เพื่อใช้ใน startActivity() ในการเริ่มกิจกรรมใหม่ แอปจะส่งพารามิเตอร์ได้โดยใช้เมธอด putExtra()

ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างวิธีดำเนินการนี้

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

ระบบปฏิบัติการจะแยกวิเคราะห์ Bundle พื้นฐานของ Intent จากนั้นระบบปฏิบัติการจะสร้าง กิจกรรมใหม่ ยกเลิกการส่งข้อมูล และส่ง Intent ไปยังกิจกรรมใหม่

เราขอแนะนำให้คุณใช้คลาส Bundle เพื่อตั้งค่าดั้งเดิมที่ระบบปฏิบัติการรู้จักในออบเจ็กต์ Intent คลาส Bundle ได้รับการเพิ่มประสิทธิภาพอย่างมาก สำหรับการจัดรูปแบบและยกเลิกการจัดรูปแบบโดยใช้พัสดุ

ในบางกรณี คุณอาจต้องส่งออบเจ็กต์ที่ซับซ้อนระหว่างกิจกรรมหรือเก็บไว้ในสถานะ UI ในกรณีดังกล่าว คลาสที่กำหนดเองควรติดตั้งใช้งาน Parcelable สำหรับแอป Kotlin และ Jetpack Compose สมัยใหม่ แนวทางที่แนะนำคือการใช้คำอธิบายประกอบ @Parcelize ซึ่งจะสร้างตรรกะการซีเรียลไลซ์ที่จำเป็นโดยอัตโนมัติเพื่อจัดการข้อมูลอย่างปลอดภัย เมื่อใช้ Bundle ซึ่งเป็นแนวทางเดียวกับที่ใช้จัดการข้อมูลของคุณเมื่อใช้ rememberSaveable ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ @Parcelize ได้ที่เครื่องมือสร้างการติดตั้งใช้งาน Parcelable

เมื่อส่งข้อมูลผ่าน Intent คุณควรระมัดระวังในการจำกัดขนาดข้อมูลไว้ที่ 2-3 KB การส่งข้อมูลมากเกินไปอาจทำให้ระบบแสดงข้อยกเว้น TransactionTooLargeException

การส่งข้อมูลระหว่างกระบวนการ

การส่งข้อมูลระหว่างกระบวนการจะคล้ายกับการส่งข้อมูลระหว่างกิจกรรม อย่างไรก็ตาม เมื่อส่ง ระหว่างกระบวนการ เราขอแนะนำว่าอย่าใช้ Parcelable ที่กำหนดเอง หากส่งออบเจ็กต์ Parcelable ที่กำหนดเองจากแอปหนึ่งไปยังอีกแอปหนึ่ง คุณต้องมั่นใจว่ามีคลาสที่กำหนดเองเวอร์ชันเดียวกันทุกประการในทั้งแอปที่ส่งและแอปที่รับ โดยปกติแล้วอาจเป็นไลบรารีทั่วไป ที่ใช้ในทั้ง 2 แอป ข้อผิดพลาดอาจเกิดขึ้นหากแอปพยายามส่ง Parcelable ที่กำหนดเองไปยังระบบ เนื่องจากระบบไม่สามารถยกเลิกการมาร์ชัลคลาสที่ไม่รู้จักได้

ตัวอย่างเช่น แอปอาจตั้งปลุกโดยใช้คลาส AlarmManager และใช้ Parcelable ที่กำหนดเอง ใน Intent ของการปลุก เมื่อสัญญาณเตือนดังขึ้น ระบบจะแก้ไข Bundle ของส่วนเพิ่มเติมใน Intent เพื่อเพิ่ม จำนวนการทำซ้ำ การแก้ไขนี้อาจส่งผลให้ระบบนำParcelableที่กำหนดเองออกจากส่วนเสริม การลบนี้อาจส่งผลให้แอป ขัดข้องเมื่อได้รับ Intent การปลุกที่แก้ไขแล้ว เนื่องจากแอปคาดว่าจะ ได้รับข้อมูลเพิ่มเติมที่ไม่มีอยู่อีกต่อไป

บัฟเฟอร์ธุรกรรม Binder มีขนาดคงที่ที่จำกัด ปัจจุบันอยู่ที่ 1 MB ซึ่งใช้ร่วมกันโดยธุรกรรมทั้งหมดที่กำลังดำเนินการสำหรับกระบวนการ เนื่องจากขีดจํากัดนี้อยู่ที่ระดับกระบวนการ แทนที่จะอยู่ที่ระดับต่อกิจกรรม ธุรกรรมเหล่านี้จึงรวมถึงธุรกรรม Binder ทั้งหมดใน แอป เช่น startActivity, rememberSaveable (ซึ่งใช้ onSaveInstanceState เบื้องหลัง) และการโต้ตอบกับระบบ เมื่อขนาดเกินขีดจำกัด ระบบจะแสดง TransactionTooLargeException

ในกรณีเฉพาะของการบันทึกสถานะด้วย rememberSaveable ควรเก็บข้อมูลไว้ในปริมาณน้อย เนื่องจากกระบวนการของระบบต้องเก็บข้อมูลที่ระบุไว้ตราบใดที่ผู้ใช้ สามารถกลับไปที่กิจกรรมนั้นได้ (แม้ว่ากระบวนการของกิจกรรมจะถูกปิดก็ตาม) เราขอแนะนำให้คุณเก็บสถานะที่บันทึกไว้ให้มีขนาดข้อมูลน้อยกว่า 50 KB

หมายเหตุ: ใน Android 7.0 (ระดับ API 24) ขึ้นไป ระบบจะส่งTransactionTooLargeExceptionเป็นข้อยกเว้นรันไทม์ ใน Android เวอร์ชันที่ต่ำกว่า ระบบจะแสดงคำเตือนใน Logcat เท่านั้น