มาใช้ Activity Results API แทน onActivityResult() กันเถอะ

Peerapong Samarnpong
te<h @TDG
Published in
1 min readJul 21, 2020

--

โดยปกติ ถ้าหากเราอยากจะให้มีการส่งข้อมูลกันระหว่าง 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

--

--