본문 바로가기
오늘은 뭘 배울까?/Android

startActivityForResult는 왜 deprecated 되었는가?

by Kim Juhwan 2021. 9. 28.

1. startActivityForResult
2. onActivityResult

3. 왜 deprecated 되었는가?

 

 

 


 

 

1. startActivityForResult

예전에는 호출한 액티비티로부터 결과를 받아오기 위해 startActivityForResult를 사용했다.

하지만 2020년 5월을 기준으로 deprecated 되고 registerForActivityResult 메서드가 생겨났다.

왜 deprecated가 되었는지 알아보기 위해 먼저 이전에 사용하던 방법에 대해 알아보자.

 

        btn.setOnClickListener {
            val intent = Intent(this, WriteActivity::class.java)
            startActivityForResult(intent, 0)
        }

위 코드는 버튼을 클릭했을 때 '0'이라는 requestCode를 가지고 WriteActivity로 이동하는 코드이다.

WriteActivity에서 작업을 마치고 돌아올 때 그대로 requestCode를 들고 원래 액티비티로 돌아오게 된다.

그러면 이제 그 requestCode에 따라 어떤 액티비티를 갔다 왔는지 알 수 있는 것이다.

그때 사용하는 메서드가 바로 다음에 설명할 onActivityResult이다.

 

만약 startActivityForResult에 대해 더 자세한 설명이 필요하다면 여기를 확인하자.

 

2. onActivityResult

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
            0 -> {
                // 작업
            }

            1 -> {
                // 작업
            }
        }
    }

원래 액티비티로 돌아오면 onActivityResult 메서드가 호출되는데

이때 requestCode를 이용해서 어떤 액티비티에서 돌아왔는지 구분을 해주고 그에 맞는 작업을 처리해주면 된다.

문제가 하나도 없어보이는 이 메서드는 대체 왜 deprecated가 됐을까?

다음 목차에서 계속 알아보자.

 

만약 onActivityResult에 대해 더 자세한 설명이 필요하다면 여기를 확인하자.

 

3. deprecated된 이유

  • onActivityResult 코드가 너무 길어진다.
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
            0 -> {
                // 작업
            }

            1 -> {
                // 작업
            }
            
            .
            .
            .
            
            99 -> {
            	// 작업
            }
        }
    }

문제는 프로젝트의 크기가 커지면서 발생한다.

뭐 나같은 뉴비 개발자들이 만드는 프로젝트쯤이야 아무런 문제가 없지만

프로젝트가 커지면서 액티비티의 수도 늘어나고 그에 따라 onActivityResult 메서드 안에 들어가는 코드의 양도 굉장히 방대해진다.

 

위 예시 코드를 보자. 99개의 액티비티가 있으면 99개를 한 콜백 함수 안에서 분기 처리해줘야 한다.

이건 유지보수에 용이하도록 최대한 코드를 나누고 나누고 나누는 요즘 패러다임에 맞지가 않다.

 

  • Permission 요청이 불편하다.
// startActivityForResult와 같은 로직
requestPermissions(requiredPermissions, 0)

// onActivityResult와 같은 로직
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    
    when(requestCode) {
        0 -> {
        
        }
    }
}

기존에는 퍼미션요청을 위와 같이 사용했었다.

앞서 설명한 startActivityForResult, onActivityResult와 메서드 이름과 역할은 다르지만 그 로직은 똑같다.

requestCode로 0을 주고... 사용자에게 권한 요청을 보내러 갔다가 돌아와서 그 결과에 따라 처리를 하는...

 

이 기존 방법을 사용했을 때 불편한 점은

requestCode에 따라 분기를 나누고 -> 해당 권한을 가지고 있는지 없는지에 따라 또 분기를 나누는데 -> 퍼미션 요청을 여러 개 해야 한다? -> 코드가 난리 법석이 나게 된다.

 

Activity Result API에서는 이 문제를 해결하기 위해 ActivityResultContracts 개념이 도입되었다.

 

ActivityResultContracts에 대한 설명은 공식문서여기를 참고하자.
만약 Permssion에 대해 더 자세한 설명이 필요하다면 여기여기를 참고하자.

 

  • requestCode가 가지는 의미

이거는 인터넷에 나오는 내용은 아니고 내가 requestCode를 사용하면서 느꼈던 불편한 점이다.

(deprecated된 공식적인 이유가 아니란 소리. 개인적인 의견)

기존 방법은 분기 처리를 위해 임의의 requestCode를 부여하게 되는데 이 숫자가 가지는 의미가 애매하다고 생각한다.

어떤 액티비티는 10이라는 값을 주고, 어떤 액티비티는 20이라는 값을 주고...

개발자가 정하기 나름인 값이라 숫자가 가지는 규칙도 의미도 없다.

다른 사람이 코드를 읽었을 때 이 숫자가 의미하는 액티비티를 알아채기가 쉽지 않다.

변수에 숫자를 넣어 사용할 수도 있겠지만 불편하다.

 

아무튼 이러한 이유들로 이 메서드들은 현재 deprecated 되었으며 registerForActivityResult가 그 역할을 대신하고 있다.

deprecated가 되었어도 아직 사용이 가능하긴 하나 안드로이드 공식문서에 따르면

AndroidX Activity와 Fragment에 도입된 Activity Result API를 사용하도록 적극 권장하고 있다.

 

 

 

 


💡 느낀 점

  • 예전에는 이렇게 사용해야하니까 사용한 거라 불편한 점을 느끼지 못했는데 새로운 방식을 사용해보니 불편했었다는 걸 알게 됐다. "더 편하게 사용할 수는 없을까?"라는 의문점을 계속 던져야 하는구나라는 걸 깨달았다.
  • MVVM 패턴 공부를 시작으로 이것 저것 공부하면서 느낀 건데 참 유지 보수에 용이하게 코드를 짜야하는 게 중요하구나라는 걸 느낀다.

📘 참고한 자료


 

반응형

댓글