티스토리 뷰
기존 방식 - startActivityForResult
먼저 activity간 데이터를 전달하는 기존 방식을 알아보자.
자세히 말하면 새로운 activity로 이동하고, 그 activity가 닫힐 때 결과를 받아오는 것이다.
1. 데이터를 받을 activity에서 새로운 activity 시작 (MainActivity.kt)
startActivityForResult(Intent(this, SubActivity::class.java), REQUEST_CODE)
기존 activity의 코드는 위와 같다.
이동하려는 activity를 Intent에 담아서 startActivityForResult()를 호출한다.
결과를 받아오지 않고 그냥 activity를 실행하려면 startActivity()를 사용했지만, 결과까지 받아오려면 startActivityForResult()를 호출한다.
이 때 결과를 요청하는 activity를 구분하기 위한 REQUEST_CODE를 인자로 전달한다.
2. 새로운 activity를 종료할 때 기존 activity에 데이터 전달 (SubActivity.kt)
setResult(RESULT_OK, Intent().apply {
putExtra("RESULT_KEY1", "test1")
putExtra("RESULT_KEY2", "test2")
}) // RESULT_CANCELED도 가능
finish()
setResult() 함수를 통해 기존 activity에 데이터를 전달한다.
intent에 전달할 데이터를 담고, activity에 이 intent까지 함께 전달한다.
intent 없이 RESULT_OK / RESULT_CANCELED만 전달할 수도 있다.
3. 기존 activity에서 데이터 받기 (MainActivity.kt)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// intent에 담긴 데이터 처리
} else if (resultCode == RESULT_CANCELED) {
// intent에 담긴 데이터 처리
} else {
//...
}
}
새로운 activity를 시작했던, 기존 activity에서 onActivityResult()를 override해서 데이터를 받아온다.
requestCode가 startActivityForResult에 전달했던 requestCode와 동일한지 확인하고,
새로운 activity가 보낸 데이터(data: Intent)를 받아 처리한다.
또한 데이터를 보낼 때 인자로 전달한 resultCode가 RESULT_OK인지, RESULT_CANCELED인지에 따라 로직을 구분할 수 있다.
이 onActivityResult() 함수가 deprecated 되었다.
이 함수를 대체할 함수가 registerForActivityResult()인데, 어떻게 사용하면 좋을지 알아보자.
deprecated 함수의 대안 - registerForActivityResult
1. 데이터를 받을 activity에서 launcher 생성하기 (MainActivity.kt)
private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val intent = result.data
// intent에 담긴 데이터 처리
} else { // Activit.RESULT_CANCELED
//...
}
}
먼저 데이터를 받을 activity에서 launcher를 생성해야 한다.
registerForActivityResult를 통해 데이터를 받는다.
이 함수의 인자로는 ActivityResultContracts.StartActivityForResult() 가 들어간다.
이 launcher를 실행하면 액티비티를 시작하고 결과를 받아온다는 의미이다.
또한 결과를 받아오고 그 결과를 처리할 콜백을 인자로 넣는다.
* launcher는 onResume() 이전에 생성해야 한다. 즉, onStart()나 onCreate(), 함수 외부에서 생성한다.
2. launcher 실행해서 새로운 activity 시작하기 (MainActivity.kt)
resultLauncher.launch(Intent(this, SubActivity::class.java))
생성한 launcher를 실행한다. 이때 launch() 함수의 인자로 새로 시작할 activity가 담긴 intent가 실행된다.
그러면 launch()함수가 호출될 때 새로운 activity가 시작된다.
3. 새로운 activity에서 데이터 보내기 (SubActivity.kt)
setResult(RESULT_OK, Intent().apply {
putExtra("RESULT_KEY1", "test1")
putExtra("RESULT_KEY2", "test2")
}) // RESULT_CANCELED도 가능
finish()
여기서는 기존 방식과 동일하게 activity를 끝내기 전에 setResult()를 통해 데이터를 전달한다.
이 activity가 끝나면 기존 activity의 launcher의 콜백이 실행되어 데이터를 받을 것이다.
+ 추가적으로 registerForActivityResult를 통해 권한을 요청하는 방법을 포스팅했다.
https://thdbs523.tistory.com/371
[안드로이드/코틀린] registerForActivityResult() - 권한 요청하기
권한 요청 방법 - 기존 방식 먼저 기존에 안드로이드에서 권한을 요청하기 위해 사용한 방법을 알아보자. 1. manifest manifest 파일의 바깥에 을 넣어준다. 2. 권한 요청 fun requestPermissions() { if(ContextCom
thdbs523.tistory.com
'android' 카테고리의 다른 글
[안드로이드/코틀린] AlarmManager 개념 알아보고 구현하기 (0) | 2023.09.29 |
---|---|
[안드로이드/코틀린] Notification 개념 알아보고 구현하기 (0) | 2023.09.26 |
[안드로이드/코틀린] registerForActivityResult() - 권한 요청하기 (0) | 2023.09.26 |
[안드로이드/android] Bundle의 개념과 Intent의 차이점, savedInstanceState (0) | 2023.09.25 |
[안드로이드/코틀린] BroadcastReceiver 개념, 구현 방법 알아보기 (0) | 2023.09.25 |