drcarter의 DevLog

android개발하다 보면 onActivityResult로 결과를 받아오는 경우가 많습니다.

A activity에서 B activity로 startActivityForResult 로 호출 후, B activity에서의 결과를 onActivityResult로 받게 되죠.

그런데, 

implementation 'androidx.activity:activity-ktx:1.2.0-alpha04'
implementation 'androidx.fragment:fragment-ktx:1.3.0-alpha04'

에서 다른 기능이 생겼습니다.

호출과 동시에 lambda function으로 다로 onActivityResult로 결과를 받지 않아도 됩니다.

 

일반적인 방법으로는

Intent(this@MainActivity, SubActivity::class.java).run {
                            startActivityForResult(this, REQUEST_CODE_SUBACTIVITY)
}

와 같은 방법으로 호출하면,

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    when (requestCode) {
        REQUEST_CODE_SUBACTIVITY -> {
            if (resultCode == Activity.RESULT_OK) {
                val resultValue = data?.getStringExtra("result") ?: ""
                binding.textCallback.text = resultValue + " Normal"
            }
        }
    }
 }

와 같이 결과를 받습니다.

 

그런데, activity-ktx:1.2.0-alpha, fragment-ktx:1.3.0-alpha에 추가된 방법으로 한다면

registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
                    when (it.resultCode) {
                        Activity.RESULT_OK -> {
                            val resultValue = it.data?.getStringExtra("result") ?: ""
                            textCallback.text = resultValue + " KTX"
                        }
                        Activity.RESULT_CANCELED -> {
                        }
                    }
                }.launch(
                        Intent(this@MainActivity, SubActivity::class.java)
                )

와 같이 진행할 수 있습니다.

onActivityResult의 override된 mehtod로 결과를 받지 않아도... 간결화된 코드로 가독성이 좋아졌다고 볼 수 있습니다.

 

StartActvityForResult이외에

StartActivityForResult
StartIntentSenderForResult
RequestMultiplePermissions
RequestPermission
TakePicturePreview
TakePicture
TakeVideo
PickContact
GetContent
...