[Android] registerForActivityResult()란?

곽호택·2021년 10월 13일
2

안드로이드

목록 보기
9/16
post-thumbnail
post-custom-banner

! 기존에 데이터 주고 받을 때 사용했던 startActivityForResult()가 derpecated 됐고, 다른 방법을 찾아보다가 registerForActivityResult()에 대해 알게 되었다!!
그 사용법에 대해 간단하게 알아보자





registerForActivityResult를 통해서 위의 사진과 같이 회원가입에서 아이디 비밀번호를 작성하고 완료 버튼을 누르면 로그인 화면으로 넘어감과 동시에 데이터도 전달해 줄 계획이다!!

1. registerForActivityResult 사용법

안드로이드 공식 문서

Activity 또는 Fragment에 있을 때, Activity Result API에서 제공하는 registerForActivityResult() API를 통해서 결과 콜백을 등록할 수 있다.

여기서 registerForActivityResult() 는 ActivityResultContract와 ActivityResultCallback을 가져와서 다른 activity를 실행하는 데 사용할 ActivityResultLauncher를 반환하다.

  • ActivityResultContract는 우리가 결과를 생성하는 데 필요한 입력의 형태와 결과를 출력하는 형태를 정의하고 우리가 intent를 사용하는 작업의 기본적인 계약을 제공한다.

까지가 안드로이드 공식 문서에 나와있는 내용이다.

코드로 살펴보자

  • 콜백을 선언한다 (SignInActivity.kt)
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를 실행한다.

  • SignUpActivity.kt
 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를 사용했을 때와 동일하게 작성하면 된다.

profile
잘하고싶다
post-custom-banner

0개의 댓글