StartActivity VS StartActivityForResult

Purang·2022년 7월 31일
0

Android Studio

목록 보기
8/28

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를 사용하여 값으로 등록할 수 있습니다.


registerForActivityResult

startActivity vs StartActivityForResult

startActivityForResult

profile
몰입의 즐거움

0개의 댓글