โดยปกติแล้วเมื่อเราต้องการส่งข้อมูลจาก Activity B ไปยัง Activity A หรือหน้าก่อนหน้า ส่วนใหญ่เราจะใช้วิธี startActivityForResult() ซึ่งเจ้าตัวนี้ได้ยกเลิกการใช้งาน (Deprecated) ไปตั้งแต่ API Level 30 (Android 11)

แต่ก็ยังสามารถใช้งานได้อยู่ถ้าหากเราจะใช้

สาเหตุที่ถูก Deprecated

  1. startActivityForResult() ใช้ onActivityResult() ซึ่งต้อง Override และจัดการโค้ดใน Activity หลัก
  2. เกิดปัญหาการรั่วไหลของข้อมูล (Memory Leak) เมื่อใช้ร่วมกับ Fragment
  3. ยากต่อการจัดการในกรณีที่ 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, ...)