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