StartActivity : 새 액티비티를 열어준다.(단방향)
StartActivityForResult : 새 액티비티를 열어줌과 동시에 결과 값을 전달합니다.(양방향)
StartActivity는 intent에서 정의한 두 개의 액티비티의 이동 액션을 수행합니다.
val intent = Intent(this, HomeActivity::class.java)
startActivity(intent)
StartActivityForResult는 액티비티간의 이동 외에 a Activity에서 b Activity로 데이터를 주고 받기도 가능합니다.
val intent = Intent(this, HomeActivity::class.java)
startActivityForResult(intent,100)
위와 같이 intent외에 requestCode를 넘겨줍니다.
그리고 다른 액티비티에는 resultCode를 정의해서
val intent : Intent = Intent(this, HomeActivity::class.java)
intent.putExtra("Msg", "테스트")
setResult(Activity.RESULT_OK, intent)
finish()
setResult로 결과를 넘겨줍니다.
넘긴 결과 값을 onActivityResult로 받습니다.
onActivityResult는 인자로 requestCode: Int, resultCode: Int, data: Intent?
를 받습니다.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == 100){
if(resultCode == Activity.RESULT_OK) {
val resultMsg = data?.getStringExtra("Msg")
Toast.makeText(this, "RESULT_OK : ${resultMsg} ", Toast.LENGTH_SHORT).show()
}
}
}
현재는 onActivityResult대신 registerForActivityResult를 사용합니다.
registerForActivityResult는 A액티비티에서 registerForActivityResult를 사용하여 Callback을 등록해주어야합니다.
private lateinit var getResultText:ActivityResultLauncher<Intent>
getResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()) {result->
if(result.resultCode == RESULT_OK) {
val str = result.data?.getStringExtra(STRING_INTENT_KEY)
Log.d(TAG, "TEST : $str")
}
}
인자로 받아온 result객체를 이용하여 resultCode와 data에 접근하여 RESULT_OK 확인과 B액티비티에서 보내온 Intent Data를 이용가능합니다.
이제 위에서 정의한 것을 버튼 클릭 시 실행하는 것으로 launch를 사용해줍니다.
btnClick.setOnClickListener{
val intent = Intent(this@MainActivity, SecondActivity::class.java)
getResultText.launch(intent)
}
이제 B액티비티에서 setResult를 통해 인자로 resultCode와 intent데이터를 넣어줍니다.
sbtnClick.setOnClickListener{
val intent = Intent(this, MainActivity::class.java).apply{
putExtra(MainActivity.STRING_INTENT_KEY, "완료")
}
setResult(RESULT_OK, intent)
finish()
}
StartActivity : B Activity에서의 결과를 A Activity에서 처리하지 않아도 될 때 사용합니다.
StartActivityForResult : B Activity에서의 결과를 A Activity에서 처리하여야할 때 사용합니다. 이를 위하여 requestCode와 resultCode, data 가 필요하며 requestCode를 통해 한 앱에서 여러 Activity와의 데이터 상호작용이 필요한 경우 각 Activity 식별을 할 수 있습니다. 또한 resultCode는 setResult를 사용하여 값으로 등록할 수 있습니다.