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

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

หมายเหตุ: 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)

Java

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

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

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

ในบางกรณี คุณอาจต้องการกลไกในการส่งออบเจ็กต์แบบผสมหรือซับซ้อนไปยังกิจกรรมต่างๆ ในกรณีเช่นนี้ คลาสที่กำหนดเองควรใช้ Parcelable และระบุ writeToParcel(android.os.Parcel, int) วิธี และต้องมีช่องที่ไม่เป็นค่าว่างที่เรียกว่า CREATOR ซึ่ง จะใช้อินเทอร์เฟซ Parcelable.Creator ซึ่ง createFromParcel() ใช้เพื่อแปลง Parcel กลับเป็นออบเจ็กต์ปัจจุบัน สำหรับข้อมูลเพิ่มเติม ดูเอกสารอ้างอิงสำหรับออบเจ็กต์ Parcelable

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

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

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

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

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

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

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