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