안드로이드 코틀린 : 전환된 Activity 종료 결과 수신하기, startActivityForResult() 와 onActivityResult()
Lucy Archive
Lucy / Facilitate4U
2021. 3. 11. 13:21

Android Kotlin : Activity 종료 결과 데이터 수신하기

지난 포스트에서 Intent를 활용하여 새로운 Activity를 실행 할 때 데이터를 전달하는 방법에 대해 소개하였습니다. 이번 포스트는 새로 생성된

Activity가 종료될 때 결과 값을 받아오는 방법을 소개

합니다. Intent를 활용하여 Activity를 전환하는 방법 및 Activity 전환시 데이터를 전송하는 방법은 이전 포스트를 참고해주세요.

 

개발환경 및 버전 정보

  • Android Studio : 4.1.2
  • Kotlin Version :  1.4.31

 

프로젝트 생성 및 환경 설정

프로젝트 생성

안드로이드에서 새로운 프로젝트를 생성합니다.

  • 템플릿 : Empty Activity
  • 프로젝트명 : StartActivityForResult

안드로이드 스튜디오 프로젝트 생성

build.gradle(Module) 설정

App > Gradle.Scripts > build.Gradle(Module) 파일의 plugins에 id 'kotlin-android-extensions'를 추가합니다. 플러그인을 추가하고 Sync Now를 선택합니다.

build.gradle(Module) 플러그인 추가

※ kotlin-android-extensions 는 레이아웃 View의 id를 코틀린 코드에서 바로 사용 할 수 있도록 해주는 플러그인입니다. 해당 플러그인은 2021년 지원이 종료 될 예정입니다. 참고해주세요. kotlin-android-extensions 를 대체하는 View Binding 방법은 아래의 링크를 참조해주세요.

안드로이드 View Binding 사용하기

 

안드로이드 View Binding 사용하기 - kotlin-android-extensions 지원 중단

안드로이드 View Binding 방법 정리 안드로이드 코드에서 레이아웃 View에 접근하기 위해 사용된 kotlin-android-extensions 의 지원이 중단예정으로, 이를 대체하여 사용 할 수 있는 ViewBinding 사용법에 대해

juahnpop.tistory.com

 

UI 만들기

activity_main.xml 레이아웃 만들기

app > res > layout > activity_main.xml 에서 아래와 같이 코드를 작성합니다. Get Name 버튼을 누르면 SubActivity에서 이름을 입력받아 textView에 출력할 예정입니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="버튼을 눌러 이름을 입력받으세요."
        android:textSize="20dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Get Name"
        android:layout_margin="20dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml 레이아웃

SubActivity 생성 후 레이아웃 만들기

SubActivity 생성

app > java 폴더에서 마우스 우클릭후 Empty Activity 추가합니다. 추가할 액티비티의 이름은 SubActivity로 지정합니다.

SubActivity 생성

activity_sub.xml 레이아웃 만들기

app > res > layout > activity_sub.xml에서 아래와 같이 코드를 작성합니다. 확인 버튼(id:btnOkay)을 누르면 SubActivity editText 뷰에 입력된 결과 값을 MainActivity로 반환할 예정입니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SubActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:hint="이름을 입력하세요"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnOkay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="확인"
        android:layout_margin="20dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_sub.xml 레이아웃

코드작성

MainActivity.kt 코드 작성

이전 포스트에서 다른 Activity를 실행하기 위해 startActivity() 함수를 사용했지만, 다른 Activity가 종료될 때 결과값을 받으려면 startActivityForResult() 함수를 사용해야 합니다. 한 앱에 여러 Activity와의 데이터 상호작용이 필요한 경우, 각 Activity를 식별하기 위해 Requset Code를 사용하여 Activity를 식별합니다.

다른 Activity가 실행 후 종료되면서 수신된 결과 값을 처리 하기 위해 onActivityResult 콜백 함수를 사용합니다. 코드 입력창에서 Ctrl+O 를 눌러 Override 할 수 있습니다.

package com.blacklog.startactivityforresult

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    val SUBACTIITY_REQUEST_CODE = 100

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 버튼 입력시 SubActivity 실행
        button.setOnClickListener {
            val intent = Intent(this, SubActivity::class.java)
            startActivityForResult(intent, SUBACTIITY_REQUEST_CODE)
        }
    }

    // Activity Result 가 있는 경우 실행되는 콜백함수
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if(resultCode == Activity.RESULT_OK){
            Log.d("MDM", "In onActivityResult")
            when(requestCode){
                SUBACTIITY_REQUEST_CODE -> {
                    val name = data?.getStringExtra("returnValue")
                    textView.text = name
                }
            }
        }
    }
}

종료된 Activity의 결과값의 데이터 타입의 종류에 따라 아래와 같은 메서드등이 사용 될 수 있습니다.

  • getBooleanExtra(key, defaultValue)
  • getIntExtra(key, defaultValue)
  • getStringExtra(key)
  • getFloatExtra(key, defaultValue)
  • getDoubleExtra(key, defaultValue)

 

SubActivity.kt

SubActivity.kt 의 코드는 아래와 같습니다. 확인 버튼을 누르면 editText 뷰에 입력된 문자열을 결과값으로 저장하고 종료합니다. 결과값은 Intent객체의 putExtra()메서드를 사용합니다. 결과값은 key와 data가 조합된 map 형태의 데이터를 저장할 수 있습니다. 

  • Intent.putExtra(key, data)
package com.blacklog.startactivityforresult

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_sub.*

class SubActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sub)

        // 종료 버튼을 누르면 실행되는 콜백 함수
        btnOkay.setOnClickListener {
            val name = editText.text.toString()
            val returnIntent = Intent()
            returnIntent.putExtra("returnValue", name)
            setResult(Activity.RESULT_OK, returnIntent)
            finish()
        }
    }
}

실행 결과

코드 작성 완료 후 Android Studio 상단 툴바에서 앱 실행 버튼을 클릭하면 아래와 같이 애뮬레이터에서 앱이 실행되는 것을 확인 할 수 있습니다.

앱 실행 버튼
앱 실행 화면

요약 : Activity 종료 결과 데이터 수신하기

MainActivity

  • 전환하고자 하는 Activity를 포함하는 Intent 인스턴스 생성
  • 액티비티 요청 코드(Request Code) 를 정의
  • startActivityForResult() 함수의 인자로 Intent 인스턴스와 요청 코드를 포함하여 액티비티 시작 요청
  • onActivityResult() 콜백 함수에서 request code로 액티비티 요청 코드를 식별하여 데이터 수신

SubActivity

  • intent 인스턴스를 생성 후 putExtra() 함수를 사용하여 결과 값 저장
  • setResult() 함수를 사용하여 결과 값을 등록
관련포스트

🤞 안드로이드 앱 제작 관련글 목록 보기

🤞 안드로이드 Intent 관련글 목록 보기

🤞 안드로이드 Actiity 관련글 목록 보기