! 기존에 데이터 주고 받을 때 사용했던 startActivityForResult()가 derpecated 됐고, 다른 방법을 찾아보다가 registerForActivityResult()에 대해 알게 되었다!!
그 사용법에 대해 간단하게 알아보자
registerForActivityResult를 통해서 위의 사진과 같이 회원가입에서 아이디 비밀번호를 작성하고 완료 버튼을 누르면 로그인 화면으로 넘어감과 동시에 데이터도 전달해 줄 계획이다!!
Activity 또는 Fragment에 있을 때, Activity Result API에서 제공하는 registerForActivityResult() API를 통해서 결과 콜백을 등록할 수 있다.
여기서 registerForActivityResult() 는 ActivityResultContract와 ActivityResultCallback을 가져와서 다른 activity를 실행하는 데 사용할 ActivityResultLauncher를 반환하다.
까지가 안드로이드 공식 문서에 나와있는 내용이다.
코드로 살펴보자
private lateinit var resultLauncher: ActivityResultLauncher<Intent>
private fun setResultSignUp(){
resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
if (result.resultCode == Activity.RESULT_OK){
val id = result.data?.getStringExtra("id") ?: ""
val password = result.data?.getStringExtra("password")?:""
binding.etId.setText(id)
binding.etPassword.setText(password)
}
}
}
registerForActivityResult 메소드를 활용해서 ActivityLauncher를 만든다.
이때의 파라미터는 ActivityResultContract, ActivityResultCallback이 필요하다.
ActivityResultContract는 startActivityForResult를 비롯하여 다양한 계약 객체들이 있으니 이는 찾아봐서 원하는 방식으로 사용하면 될 것이다.
ActivityResultCallback 람다에서는 ActivityResult 객체가 파라미터로 떨어지고 여기서 우리가 intent와 result Code를 사용해서 원하는 데이터를 가져오면 된다.
private fun clickSignUp(){
binding.btnSignUp.setOnClickListener {
val intent = Intent(this, SignUpActivity::class.java)
resultLauncher.launch(intent)
}
}
그 뒤 resultLauncher.launch()를 통해 데이터를 받아올 activity를 실행한다.
private fun clickSignUp(){
with(binding){
btnSignup.setOnClickListener {
if(etSignupId.length() == 0 || etSignupName.length() == 0 || etSingupPassword.length() == 0){
Toast.makeText(this@SignUpActivity, "입력하지 않은 정보가 있습니다.", Toast.LENGTH_SHORT).show()
} else {
val intent = Intent(this@SignUpActivity, SignInActivity::class.java)
intent.putExtra("id", etSignupId.text.toString())
intent.putExtra("password", etSingupPassword.text.toString())
setResult(RESULT_OK, intent)
finish()
}
}
}
}
데이터를 보내는 activity에서는 우리가 intent를 사용했을 때와 동일하게 작성하면 된다.