มาใช้ Activity Results API แทน onActivityResult() กันเถอะ
โดยปกติ ถ้าหากเราอยากจะให้มีการส่งข้อมูลกันระหว่าง 2 Activity วิธีที่เราใช้กันมาตลอดคือ เรียกผ่าน startActivityForResult() และ onActivityResult() ดังโค้ดตัวอย่างข้างล่าง
บางครั้งเมื่อแอปพลิเคชั่นมาขนาดใหญ่ขึ้น method นี้ก็อาจจะประกอบไปด้วย if else ที่ซ้อนกัน เพิ่มจำนวนขึ้นเรื่อย ๆ ซึ่งอาจจะทำให้โค้ดดูอ่านยากขึ้น
มาใช้ Activity Results API กันดีเถอะ
Activity Results API นั้นเป็น API ที่มีมาให้ใน AndroidX Activity 1.2.0-alpha02 และ AndroidX Fragment 1.3.0-alpha02 ซึ่งให้เราสามารถ handle onActivityResult ได้ clean และ reuse ได้ง่ายขึ้น
ไม่พูดพร่ำทำเพลงเยอะ เรามาลองเขียนกันดีกว่า
1. เพิ่ม Dependencies
Noted: ณ ตอนที่เขียนบทความนี้ version ล่าสุดสำหรับ activity-ktx คือ 1.2.0-alpha06 และ 1.3.0-alpha06 สำหรับ fragment-ktx.
2. สร้าง Contract
สร้าง class ที่ extends ActivityResultContact<I, O>
โดย I
คือ datatype ของ input ส่วน O
คือ data type ของ output และต้องมี override method เพิ่มอีก 2 method โดย createIntent()
จะเป็น method ที่เอาไว้สำหรับเรียกแทน startActivityForResult()
และ parseResult()
เป็น method ที่ใช้ในการรับข้อมูลทีได้รับกลับมา เหมือนใน onActivityResult()
3. Register Contract
ขั้นตอนต่อไปคือ register UploadActivityContract
ให้กับ Activity Results API โดยใช้ registerForActivityResult()
4. Launch Activity
เราสามารถเรียกใช้งานผ่านทางตัวแปรที่เรา register ไว้ เพียงเท่านี้ก็สามารถใช้งานได้แล้ว โดยไม่ต้องเพิ่ม Request Code แต่อย่างใด เพราะการทำงานพวกนั้น ComponentActivity
จัดการให้เราเรียบร้อยแล้ว
References