onActivityResult deprecated. (feat. ActivityResult)

지프치프·2022년 3월 8일
1
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


개요

다른 액티비티로부터 값을 가져오는 방법으로
startActivityForResult()를 사용하는 방법이 있다.
이를 사용하면 onActivityResult()를 통해 값을 가져올 수 있는데
이 방법이 deprecated 되었다.

그리고 새로운 ActivityResult가 소개되었는데
한번 알아보도록 하겠다.

registerForActivityResult

먼저 가져온 값을 처리할 콜백을 등록해야한다.
registerForActivityResult()를 사용하여 등록해주면 된다.

    private val testLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if(result.resultCode == RESULT_CODE) {
            // Got data from other activity and process that data
            Log.e("${result.data}")
        }
    }

쉽게 생각하자면 기존에 onActivityResult()에서 처리하던 코드라고 생각하면 된다.

차이가 있다면
onActivityResult()의 경우는 한 곳에서
REQEUST_CODE를 통해 Activity를 구분하고 처리했지만

ActivityResult는 각 Target Activity마다
ActivityResult를 만들어서 처리할 코드를 작성한다.
그래서 REQUEST_CODE가 없다

ActivityResultContract

이 ActivityResultContract가 핵심이라고도 할 수 있는데
type-safe한 결과를 호출해주는 추상클래스이다.
쉽게 말해서 반환받을 값의 type을 지정해준다고 할 수 있겠다.

ActivityResultcontracts에는
기본적으로 구현된 여러가지 Contract들이 있는데 공식문서를 참고하여
원하는 것을 취사선택하여 사용하면 되겠다.
절대 양이 많아서 그런 것이 아니다

커스텀하여 자신이 원하는 type을 지정해주는 것도 가능하다.
일례로 Zxing에서 이번에 3.4.0으로 릴리즈되면서
ActivityResult로 대체되었는데
Zxing 또한 커스텀된 것을 사용한다.

위 사진을 보면 ScanContract()라는 커스텀된 것을 볼 수 있다.

launch

기존에 사용되던 startActivityForResult()라고 생각하면 편하다.
위에 registerForActivityResult()를 등록해준
testLauncher를 사용하여 이동할 Activity를 지정해준다.

tesetLauncher.launch(Intent(this, TargetActivity::class.java))

setResult

Activity에서 값을 보내는 방법으로 기존과 똑같이 사용하면 된다.

val intent = Intent(this, MainActivity::class.java).apply {
				putExtra("dataName", data)
            }
setResult(RESULT_CODE, intent)

정리

살펴보니 많이 바뀌거나 한 부분은 없는 거 같고
ActivityResultContract가 새로 생겨난 것만 주의하면 될 거 같다.

구조 자체는 기존과 유사한 거 같아 마이그레이션하는데는 큰 불편함은 없을 거 같다.
필자의 뇌피셜이다

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글