본문 바로가기
Android Studio/Kotlin

Android Studio Request Code

by ksb0511 2020. 4. 7.

 안드로이드 스튜디오에서 requestCode를 쓰는 이유는 각 액티비티를 구별하고 데이터를 좀 더 원활히 주고받을 수 있도록 하기 위해서이다. 둘 중 한 가지를 꼽자면 그냥 액티비티를 구별하기 위해서이다.

 

 requestCode를 쓰려면 startActivityForResult()를 호출해야한다.

 참고로 원래 Intent 쓰는 법을 보자면,

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

 이런 식으로 startActivity에 intent를 넣어주면 그만이다.

 하지만 requestCode를 주고받으려면 쓸 수가 없다. 그래서 사용하는 것이 startActivityForResult()이다. 이에 대해 짧게 말해보자면, 응답하는 활동은 결과를 반환하도록 설계되어야 하고, 활동은 또 다른 Intent 개체로 결과를 전송해야 한다. 또한 이 활동은 onActivityResult() 콜백에서 결과를 수신해야 한다.

 위의 내용은 이해하기 어려우므로 풀어서 설명을 써보겠다.

 

startActivityForResult의 쓰는 법을 간단한 예를 들어 보여주자면,

val intent = Intent(this, MainActivity::class.java)
startActivityForResult(intent, 2000)

 위의 코드를 보면 알다시피 정수인수가 추가로 들어간다. 이 정수인수는 요청을 식별하는 '요청 코드'라고 생각하면 쉽다. 이 인수가 쓰일 때는 현재 액티비티에서 여러 개의 activity를 실행하고 각 액티비티에서 결과를 받을 때 쓰인다고 보면 된다.

 

 만약 사용자가 후속 활동을 마치고 돌아오면, 시스템은 활동의 onActivityResult() 메소드를 호출한다.

onActivityResult() 메소드에는 3가지의 인수가 필수적으로 들어간다.

 - requestCode : Int / startActivityForResult()에 전달한 요청 코드를 의미

 - resultCode : Int / 두 번째 활동이 지정한 결과코드를 의미

 - data : Intent / 결과 데이터를 전달하는 Intent

 

 이어서 onActivityResult() 메소드 예를 보여주자면,

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode == 2000){
        	if(resultCode == 1000){
            ...
            }
        ...
        }
}

이런 식으로 사용할 수 있다.

 그렇다면 resultCode는 어디서 보내지는 지에 대해 알아보자.

 

먼저 간단하게 이해를 돕기위해 activity A, B 두 개가 있다고 가정하고 그 사이에 requestCode와 resultCode를 쓴다고 하면, 틀이 이렇게 될 것이다.

액티비티 A에서 B로 넘어갈 때에 requestCode 1000을 함께 발생시킨다.

 그리고 B에서 예를 들어 특정버튼을 눌렀을 경우 화면이 꺼진다고 한다면, btn.setOnClickListener 이벤트를 이용하여 그 안에 resultCode 2000을 A로 넘겨 다시 A로 돌아왔을 때 onActivityResult 메소드가 발생이 된다.

 이 메소드의 인자는 requestCode, resultCode, data로 총 세개이고 if문을 사용하여 아까 발생시킨 requestCode 1000값이 맞을 경우, B에서 보내진 resultCode 2000 값이 맞을 경우로 코드를 짤 수 있다.

 

참고로 setResult 없이도 그냥 requestCode만 사용하여도 가능하다.

 

이렇듯 requestCode는 다른 액티비티로 부터 값을 주고받을 때 뿐만 아니라, 응답 활동을 바로 결과 전송이 가능하다는 장점이 있다. 예를 들어 메인액티비티에서 여러 다른 액티비티들을 실행할 수 있고, 각 액티비티에서 결과를 받아야하는 경우에 사용하면 구분하기 쉽다.

 

ex) 쌓여있는 화면 여러개 한 번에 종료시킬 경우(ex. 설문조사 완료 시 액티비티를 종료시켜서 메인으로 돌아가게끔 하는 앱)

댓글