'startActivityForResult(Intent!, Int): Unit' is deprecated. Deprecated in Java

 

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

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

 

        btn.setOnClickListener {

            val intent = Intent(this, WriteActivity::class.java)

            startActivityForResult(intent, 0)

        }

 

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

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

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

그때 사용하는 메서드가 onActivityResult이다.

 

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

        super.onActivityResult(requestCode, resultCode, data)

 

        when (requestCode) {

            0 -> {

                // 작업

            }

 

            1 -> {

                // 작업

            }

        }

    }

 

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

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

그리고 이 메서드는 deprecated 되었다

이유는 onActivityResult 코드가 너무 길어지고 Permission 요청이 불편해서 이다

 

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

        super.onActivityResult(requestCode, resultCode, data)

 

        when (requestCode) {

            0 -> {

                // 작업

            }

 

            1 -> {

                // 작업

            }

            

            .

            .

            .

            

            99 -> {

            // 작업

            }

        }

    }

 

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

 

// 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에 대해 더 자세한 설명이 필요하다면 여기와 여기를 참고하자.

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
128 PC를 위한 최고의 안드로이드 에뮬레이터 황제낙엽 2023.01.18 3132
127 [Jetpack Compose UI / 상추님] GDG Jetpack compose 코드랩 수료 후기 (feat. 굿즈) 황제낙엽 2022.12.24 2370
126 [Jetpack Compose UI / kyj1991719] compose - Compose 이해 황제낙엽 2022.12.24 4025
125 [Jetpack Compose UI / 꾸준] Compose 가 뭔데...? 황제낙엽 2022.12.24 4035
124 [Jetpack Compose UI / IIVIKI] Compose 학습과 분석 황제낙엽 2022.12.24 4050
123 [Jetpack Compose UI] 스터디 시작하기 황제낙엽 2022.12.24 4001
122 [개발하는 정대리] 취준생을 위한 안드로이드 앱만들기 - 바텀네비게이션 뷰, 네비게이션 AAC file 황제낙엽 2022.12.22 3882
121 [개발하는 정대리] 취준생을 위한 안드로이드 앱만들기 - 뷰바인딩 file 황제낙엽 2022.12.22 3850
120 [개발하는 정대리] 취준생을 위한 안드로이드 앱만들기 - 라이브데이터 뷰모델 file 황제낙엽 2022.12.21 3826
119 [대왕놀] ImageButton in Compose (IconButton) 황제낙엽 2022.12.20 4105
118 [대왕놀] compose instrumentation test tutorial 황제낙엽 2022.12.20 3985
117 [대왕놀] Switch in Compose 황제낙엽 2022.12.20 4106
116 [대왕놀] EditText in Compose (TextField) 황제낙엽 2022.12.20 4021
115 [대왕놀] margin in Compose 황제낙엽 2022.12.20 4105
114 [대왕놀] modifier in compose 황제낙엽 2022.12.20 4180
113 [대왕놀] Button in Compose file 황제낙엽 2022.12.20 4224
112 [대왕놀] TextView in Compose (Text) 황제낙엽 2022.12.20 4083
111 [대왕놀] ImageView in Compose (Image) 황제낙엽 2022.12.20 4017
110 [대왕놀] LinearLayout in Compose (Row, Column) 황제낙엽 2022.12.20 4113
109 [대왕놀] Introduction to Jetpack compose 황제낙엽 2022.12.20 3964