โดยปกติแล้วเมื่อเราต้องการส่งข้อมูลจาก Activity B ไปยัง Activity A หรือหน้าก่อนหน้า ส่วนใหญ่เราจะใช้วิธี startActivityForResult() ซึ่งเจ้าตัวนี้ได้ยกเลิกการใช้งาน (Deprecated) ไปตั้งแต่ API Level 30 (Android 11)
แต่ก็ยังสามารถใช้งานได้อยู่ถ้าหากเราจะใช้
สาเหตุที่ถูก Deprecated
- startActivityForResult() ใช้ onActivityResult() ซึ่งต้อง Override และจัดการโค้ดใน Activity หลัก
- เกิดปัญหาการรั่วไหลของข้อมูล (Memory Leak) เมื่อใช้ร่วมกับ Fragment
- ยากต่อการจัดการในกรณีที่ Activity ถูกทำลายและสร้างขึ้นใหม่ (เช่น การเปลี่ยนทิศทางหน้าจอ)
วิธีใช้งาน ActivityResultLauncher
ประกาศออบเจ็คเจ้าตัวนี้ภายใต้คลาส Activity ที่ต้องการรับข้อมูล
** ในที่นี้ขออนุญาตใช้ MainActivity เป็นหน้ารับข้อมูล
class MainActivity : AppCompatActivity() {
private lateinit var resultLauncher: ActivityResultLauncher<Intent>
...
จากนั้นให้ทำการ register ภายใต้เมธอด onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
...
bindResultLauncher()
}

ตอนที่เราจะเปิดหน้า Activity ที่จะต้องการส่งข้อมูล ให้เปิดด้วย
val intent = Intent(this, LoginActivity::class.java)
resultLauncher.launch(intent)
** ในที่นี้ขออนุญาตใช้ LoginActivity เป็นหน้าส่งข้อมูล
ตอนนี้ให้จินตนาการว่าหน้า LoginActivity กำลังถูกเปิดอยู่ เราต้องการส่งข้อมูลจากหน้านี้กลับไปยังหน้าก่อนหน้า ซึ่งก็คือหน้า MainActivity
เราใช้โค้ดข้างล่างนี้ในการส่งข้อมูลกลับไป
val intent = Intent()
intent.putExtra("isTapCloseButton", true)
setResult(Activity.RESULT_OK, intent)
โดยที่ตัวคีย์ "isTapCloseButton" จะเป็นอะไรก็ได้แต่ต้องตรงกัน
และตัว result code (Activity.RESULT_OK) จะเป็นอะไรก็ได้เช่นกัน แต่ต้องตรงกันทั้งหน้ารับและส่งข้อมูล มี type เป็น Integer (1, -1, 222, ...)
Discussion