기존에는 액티비티에서 값을 받아올 때 startActivityForResult()
와 onActivityResult()
를 사용했지만 deprecated 되었다.
Activity 클래스에서 사용할 수 있지만, Androidx Activity와 Fragment에 도입된 Activity Result API 사용을 적극 권장한다고 한다!!
🤩 MainActivity <-> SecondActivity 쌍방향 데이터 전달 가능!
MainActivity <-> SignUpActivity 간에 데이터 전달!
![]()
1. ActivityResultLauncher자료형인 getResult 변수를 전역 변수로 선언
private lateinit var getResult : ActivityResultLauncher<Intent>
2. 만들어준 변수 getResult에 registerForActivityResult메소드를 활용해서 ActivityLauncher 를 만든다.
!! registerForActivityResult메소드의 파리미터는 ActivityResultContract, >ActivityResultCallback가 필요하다.
!! ActivityResultContract는 startActivityForResult를 비롯하여 다양한 객체들이 있다.
!! ActivityResultCallback은 람다로 사용하고 ActivityResult 객체가 파라미터로 떨어지고 여기서 원하는 데이터를 가져오면 된다.
그 후 result.resultCode가 올바르게 넘어오면 B액티비티에서 넘겨준 이름과 나이를 getStringExtra로 받는다.getResult = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ){result -> if(result.resultCode == RESULT_OK){ val getId = result.data?.getStringExtra("id") ?: "" val getPw = result.data?.getStringExtra("pw") ?: "" val getName = result.data?.getStringExtra("name") ?: "" val getTalent = result.data?.getStringExtra("talent") ?: "" Snackbar.make( binding.root, "회원가입이 완료되었습니다.", Snackbar.LENGTH_SHORT ).show() }
3. 만들어준 getResult.launch()를 통해 데이터를 받아올 Activity를 실행한다.
binding.signUpBtn.setOnClickListener { val intent = Intent(this, SignUpActivity::class.java) getResult.launch(intent) }
4. 데이터를 보내줄 Activity인 SignUpActivity에서 setResult를 등록한다.
val intent = Intent(this, MainActivity::class.java) intent.putExtra("id", id.text.toString()) intent.putExtra("pw", pw.text.toString()) intent.putExtra("name", name.text.toString()) intent.putExtra("talent", talent.text.toString()) setResult(RESULT_OK, intent) finish()