ออบเจ็กต์ 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 เท่านั้น