배경
startActivityForResult() / onActivityResult() 사용했을 시
ActivityResultLauncher 객체와 registerForActivityResult()를 사용했을 시
Activity Result API
예제
lateinit var getResultText: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.button)
//registerForActivityResult()함수의 매개변수로 ActivityResultcontract,
//ActivityResultCallback을 전달해서 함수 호출 결과로 ActivityLauncher 인스턴스를 얻어낸다.
//registerForActivityResult()는 콜백을 등록하는 함수일 뿐,
//실제 액티비티 실행이나 결과 요청은 여기서 반환된 ActivityResultLauncher 인스턴스가 담당한다.
getResultText =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
val data = result.data?.getStringExtra("result")
Log.d("heec.choi", "getData:$data")
}
}
button.setOnClickListener {
val intent = Intent(this, MainActivity2::class.java)
intent.putExtra("data", "heec.choi")
//ActivityLauncher<I>는 ActivityResultContract<I> 타입과 일치하는 입력을 가져온다.
//launch()함수를 호출하면 결과를 생성하는 프로세스가 시작된다.
//사용자가 후속 활동을 완료하고 반환하면 ActivityResultCallback의 onActivityResult()함수가 실행됩니다.
getResultText.launch(intent)
}
(MainActivity)
class MainActivity2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val textView2 = findViewById<TextView>(R.id.text2)
val button2 = findViewById<Button>(R.id.button2)
val intent = intent
textView2.text = intent.getStringExtra("data")
button2.setOnClickListener {
intent.putExtra("result", "happy coding")
setResult(RESULT_OK, intent)
if (!isFinishing) finish()
}
}
}
(MainActivity2)