startActivityForResult()와 onActivityResult() 가 deprecated 되었습니다. 이를 대신하여 AndroidX Activity 1.2.0-alpha02 와 Fragment 1.3.0-alpha02에 도입된 Activity Result API를 사용합니다.
결과를 얻기 위해 활동을 시작할 때, 메모리 부족으로 인해 프로세스와 활동이 소멸될 수 있습니다(특히, 카메라 사용과 같이 메모리를 많이 사용하는 작업의 경우 소멸 확률이 매우 높음).
따라서, Activity Result API는 다른 활동을 실행하는 코드 위치에서 결과 콜백을 분리합니다. 결과 콜백은 프로세스와 활동을 다시 생성할 때 사용할 수 있어야 하므로 다른 활동을 실행하는 로직이 사용자 입력 또는 기타 비즈니스 로직을 기반으로만 발생하더라도 활동이 생성될 때마다 콜백을 무조건 등록해야 합니다.
ComponentActivity 또는 Fragment에 있을 때, Activity Result API에서 제공하는 registerForActivityResult() API를 통해 결과 콜백을 등록할 수 있습니다. registerForActivityResult()는 ActivityResultContract 및 ActivityResultCallback을 가져와서 다른 활동을 실행하는 데 사용할 ActivityResultLauncher를 반환합니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
startSecondActivity()
}
private fun startSecondActivity() {
val intent = Intent(this@MainActivity, SecondActivity::class.java)
activityResultLauncher.launch(intent)
}
private val activityResultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
it.data?.let { intent ->
if (intent.hasExtra(SecondActivity.RESULT_DATA)) {
Toast.makeText(
this@MainActivity,
intent.getStringExtra(SecondActivity.RESULT_DATA),
Toast.LENGTH_SHORT
).show()
}
}
}
}
}
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val button = findViewById<Button> (R.id.button_close)
button.setOnClickListener {
val intent = Intent().putExtra(RESULT_DATA, "hello")
setResult(RESULT_OK, intent)
finish()
}
}
companion object {
const val RESULT_DATA = "result_data"
}
}