startActivityForResult가 deprecated되었다.
여전히 많은 강의나 글들이 startActivityForResult를 통해 intent의 정보를 주고받는 방법을 알려 주고 있다.
Android Studio에서 아직 사용이 가능하긴 하지만,
어쨌든 사용중지 된다고 하니 다른 방법을 찾아야 한다.
intent를 사용해서 정보를 주고받을 때 단방향의 경우와, 양방향의 경우가 있다.
단방향은 한 액티비티에서 다른 액티비티로 넘어가는 경우가 있다.
이러한 경우 A에서 B로 넘어간 후 B에서 다시 A로 정보를 전달해야 할 일이 없으니 단방향이라고 할 수 있다.
이때는 startActivity(intent)를 활용하면 된다.
반면 A에서 B로 화면을 전환한 후, B가 종료될 때 전달한 정보를 이용해 A를 구성해야 한다면 이는 양방향이라고 할 수 있다.
문제는 쉽게 말하자면 startActivityForResult를 이용해 A에서 B로 intent를 전달했는데, 메모리상의 이유로 A가 사라졌을 때이다.
B에서 다시 A로 전달할 때 A가 새로 생기는데, 이 때 자신이 B로 intent를 전달했다는 사실을 기억할 방법이 없다.
그래서 자신이 결과를 기다리고 있다는 사실을 모르게 되는 것이다.
또 만약 A에서 B로, A에서 C로, A에서 D로 보내는 각각의 intent를 만들었다.
이 각각의 intent는 서로 구분하기 위해 requestCode를 가진다.
B로 보낸 requestCode를 bb, C로 보낸 requestCode를 cc, D로 보낸 requestCode를 dd라고 하자.
이떄 B, C, D가 종료된 후 A에서 결과를 처리하는 함수인 onActivityResult 내에서
bb, cc, dd에 관한 처리를 전부 해주어야 한다.
지금은 3개지만 intent가 많아질수록 onActivityResult 안에서 처리해야 할 결과도 그만큼 많아지게 된다.
그래서 startActivityForResult와 onActivityResult로 돌아가던 매커니즘을 없애버리고
ActivityResultLauncher라는 걸 사용하기로 했다.
기존의 코드를 보자.
AActivity.kt
val intent = Intent(this, BActivity::class.java)
startActivityForResult(intent, 10)
AActivity에서 BActivity로 intent를 보냈다.
이때 A->B intent임을 식별하기 위해 requestCode로 10을 넣었다.
BActivity.kt
val intent = Intent()
intent.putExtra("name", name)
setResult(Activity.RESULT_OK, intent)
finish()
BActivity에서는 종료되고 A로 돌아가야 할 타이밍에 intent에 필요한 정보를 넣어 보낸다.
RESULT_OK로 결과가 성공적으로 반환됨을 표시하고, finish를 통해 BActivity를 종료한다.
AActivity.kt
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
when (requestCode) {
10 -> {
val name = data!!.getStringExtra("name").toString()
... //활용
}
}
}
}
requestCode가 10임을 활용해 B에서 온 정보를 활용해야 하는 코드를 작성한다.
이 코드를 새롭게 바꿔보자.
private lateinit var getResult: ActivityResultLauncher<Intent>
우선 ActivityResultLauncher 변수를 만들어준다.
getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
if(it.resultCode == RESULT_OK){
val name = it.data!!.getStringExtra("name").toString()
... //활용
}
}
onCreate안에 getResult를 초기화해주자.
registerForActivityResult를 통해 콜백 함수를 등록한다.
원래의 onActivityResult안에서 구현했던 내용을 여기에 적는다.
val intent = Intent(this, BActivity::class.java)
getResult.launch(intent)
startActivityForResult를 사용하는 대신 getResult.launch(intent)를 사용한다.
requestCode를 사용할 필요가 없어졌다.
'🤓 TIL > 안드로이드' 카테고리의 다른 글
| 안드로이드 http 통신 라이브러리 (0) | 2022.05.20 |
|---|---|
| Flow vs LiveData (0) | 2022.05.12 |
| Dexter 사용해서 권한 요청하기 (0) | 2022.04.22 |
| DatePicker 사용해서 SimpleDateFormat으로 text 저장하기 (0) | 2022.04.22 |
| Room Database 이용하기 - (2) (0) | 2022.04.21 |