기존에는 startActivityForResult를 이용하여 액티비티 이동시 Result값을 받아오겠다는 것을 알려주고 onActivityResult()를 이용하여 값을 액티비티의 이동후 다 원래 액티비티로 돌아왔을 때 Result로 받아온 값들을 이용할 수 있었습니다. 그렇지만 최근에 와서는
이렇게 startActivityForResult가 deprecated 되면서 안드로이드 자체에서 쓰는 것을 권유하지 않습니다. 역시 같이 쓰이던 onActivityResult() 또한 deprecated 되었습니다.
Deprecated : 이 메서드는 ActivityResultContract 및 androidx.activity.result.contract.ActivityResultContracts에서 사용할 수 있는 공통 인텐트에 대한 사전 빌드된 계약을 통해 유형 안전성을 높이고, 테스트를 위한 후크를 제공하고, 활동과 독립적인 별도의 테스트 가능한 클래스. ActivityResultContract에 대한 StartActivityForResult 개체를 전달하는 registerForActivityResult(ActivityResultContract, ActivityResultCallback)를 사용합니다.
이처럼 안드로이드에서는 ActivityResultContract의 StartActivityForResult 개체를 이용한 registerForActivityResult의 사용을 권유하고 있습니다. 그렇다면 startActivityForResult는 왜 deprecated가 되었으면 registerForActivityResult는 어떻게 동작하는 것일까요?
startActivityForResult가 deprecated 된 이유
1. ActivityResult의 등장
기존은 startAcitvityForResult의 경우 requestCode를 받아
위 onActivityResult에서 해당 requestCode가 맞을 경우에만 해당 동작을 수행하였습니다. 그렇지만
이렇게 Androidx의 ActivityResult가 등장하면서 안드로이드에서는 이를 적극 권장하고 있었습니다.
그에 반해 onActivituResult나 startAcitvityForResult 같은 ActivityResult를 사용하지 않고 requestCode같이 정수형 데이터들을 받아오는 이런 함수 들은 deprecated 될 위험이 있었습니다.
2. 메모리 부족
안드로이드 같은 경우 휴대용 기기이기 때문에 기기의 특성상 메모리 관리를 잘해줘야 합니다. 그렇지 않을 경우 안드로이드 OS 자체에서 메모리가 부족하다고 판단 될 때 필요 없는 앱들을 Kill 하기도 합니다. 이러한 안드로이드 특성상 앱에서 인텐트로 카메라 같은 다른 앱을 호출할 경우 기존의 앱이 Kill이 된 경우 다시 앱을 켰을때 요청한 것을 기억 못 하기 때문에 값을 받아올 수 없습니다.
이런 2가지 이유들로 startActivityForResult는 deprecated 되었습니다. 그렇다면 이를 대체할 ActivityResultLauncher객체는 어떻게 동작할까요?
ActivityResultLauncher객체의 동작과 사용법
위에서 말한 데로 startActivityForResult가 deprecated 된 후 안들로이드 ActivityResultLauncher를 이용한 액티비티의 이동을 추천하고 있습니다.
ActivityResultLauncher객체를 반환하는 registerForActivityResult를 이용하여 registerForActivityResult로 초기화해 줍니다.
context는 ActivityResultContract 객체를 넣어주고 callback의 경우 인터페이스이기 때문에 해당 인터페이스를 구현해 주면 됩니다.
함수는 하나밖에 없으므로 구현은 람다로 O 즉 ActivityResultContract의 O 즉 위 같은 상황에서는 ActivityResult를 매개변수로 받는 함수를 구현해 주면 됩니다. ActivityResult 같은 경우 해당 resultCode를 이용하여 상황에 맞게 조건문으로 분할해 주면 좋습니다.
해당 코드는 ActivityResultLauncher객체를 초기화하는 모습입니다. 콜백함수의 매개변수인 ActivityResult를 이용하여 값 중 data의 경우 onActivityResult와 마차가지로 Intent자료형을 씁니다. 이 값을 이용하여 result를 사용할 수 있습니다.
이동의 경우 이렇게 ActivityResultLauncher객체의 launch함수에 intent를 집어넣어 이동할 수 있습니다.
결과의 경우 setResult의 resultCode와 intent를 집어넣어 result를 저장할 수 있습니다. 또한 ActivityResultLauncher객체와 registerForActivityResult()를 이용하면 Activity가 종료됐다 다시 만들어져도, Result 값을 기다리고 있다는 것을 알려줄 수 있습니다.
'안드로이드 > 안드로이드' 카테고리의 다른 글
[Android/Kotlin] 알림(Notification)아이디 채널아이디 (2) | 2023.08.30 |
---|---|
[Android/Kotlin] 뷰 바인딩(ViewBinding) (2) | 2023.08.28 |
[Android/Kotlin] 리사이클러뷰(RecyclerView) 어댑터 이야기 (0) | 2023.08.08 |
[안드로이드] context는 무었인가 (0) | 2022.04.30 |
[안드로이드]Toast 메시지 (0) | 2022.03.22 |