Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드에서 이전 액티비티로 데이터를 되돌려 보내는 방법 (startActivityForResult 완벽 가이드)


개요

이 튜토리얼에서는 안드로이드 앱에서 두 번째 액티비티에서 입력한 데이터를 이전(첫 번째) 액티비티로 되돌려 전달하는 방법을 단계별로 알아봅니다. 핵심은 다음 세 가지 요소를 함께 사용하는 것입니다.

  • startActivityForResult(intent, requestCode) — 결과를 기대하며 새 액티비티를 실행합니다.
  • setResult(RESULT_OK, intent) — 호출된 액티비티가 결과 데이터를 담아 반환합니다.
  • onActivityResult() — 호출한 액티비티가 돌아온 결과를 수신해 처리합니다.

1단계 — 새 프로젝트 만들기

Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

2단계 — activity_main.xml 작성

res/layout/activity_main.xml에 아래 코드를 추가합니다. 화면 중앙에는 결과를 표시할 TextView를, 하단에는 SecondActivity를 여는 버튼을 배치합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="16dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="데이터 가져오기" />

</RelativeLayout>

3단계 — MainActivity.java 작성

src/MainActivity.java에 아래 코드를 추가합니다. 버튼을 누르면 startActivityForResult()로 SecondActivity를 실행하고, 돌아올 때 onActivityResult() 콜백에서 결과 문자열을 받아 TextView에 표시합니다.

package com.example.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private final static int MY_REQUEST_CODE = 1;
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.text_view);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivityForResult(intent, MY_REQUEST_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == MY_REQUEST_CODE) {
                if (data != null)
                    textView.setText(data.getStringExtra("value"));
            }
        }
    }
}

4단계 — activity_second.xml 작성

res/layout/activity_second.xml에 아래 코드를 추가합니다. 화면 중앙에는 입력을 받을 EditText를, 하단에는 결과를 반환하고 종료하는 버튼을 배치합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="16dp"
    tools:context=".SecondActivity">

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:hint="이전 액티비티로 돌려보낼 내용을 입력하세요"
        android:inputType="text" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="완료" />

</RelativeLayout>

5단계 — SecondActivity.java 작성

src/SecondActivity.java에 아래 코드를 추가합니다. '완료' 버튼을 누르면 EditText의 값을 Intent에 담아 setResult()로 설정한 뒤 finish()로 액티비티를 종료하고, 그 결과가 첫 번째 액티비티로 전달됩니다.

package com.example.myapplication;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        final EditText editText = findViewById(R.id.edit_text);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String value = editText.getText().toString().trim();
                Intent intent = new Intent();
                intent.putExtra("value", value);
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

6단계 — AndroidManifest.xml 등록

새로 추가한 SecondActivity를 매니페스트에 반드시 등록해야 합니다. androidManifest.xml에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".SecondActivity"></activity>
    </application>

</manifest>

앱 실행 및 결과 확인

이제 앱을 실행해 봅시다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 안드로이드에서 이전 액티비티로 데이터를 되돌려 보내는 방법 (startActivityForResult 완벽 가이드) 아이콘을 클릭합니다. 목록에서 자신의 모바일 기기를 선택하면, 기기 화면에 아래와 같은 기본 화면이 표시됩니다.

안드로이드에서 이전 액티비티로 데이터를 되돌려 보내는 방법 (startActivityForResult 완벽 가이드)

 안드로이드에서 이전 액티비티로 데이터를 되돌려 보내는 방법 (startActivityForResult 완벽 가이드)

안드로이드에서 이전 액티비티로 데이터를 되돌려 보내는 방법 (startActivityForResult 완벽 가이드)

'데이터 가져오기' 버튼을 눌러 SecondActivity로 이동한 후, 텍스트를 입력하고 '완료'를 누르면 입력한 값이 첫 번째 화면의 TextView에 그대로 표시되는 것을 확인할 수 있습니다.

참고: 최신 방식 — Activity Result API

startActivityForResult()onActivityResult()는 API 30(Android 11)부터 공식적으로 지원 중단(deprecated)되었습니다. 최신 프로젝트에서는 registerForActivityResult()를 사용하는 것이 권장됩니다. 동일한 동작을 현대적인 방식으로 구현하면 다음과 같습니다.

private final ActivityResultLauncher<Intent> launcher =
    registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() == Activity.RESULT_OK
                    && result.getData() != null) {
                textView.setText(result.getData().getStringExtra("value"));
            }
        });

// 버튼 클릭 시
launcher.launch(new Intent(MainActivity.this, SecondActivity.class));

SecondActivity 쪽의 setResult() + finish() 처리 방법은 기존 방식과 동일하게 유지하면 됩니다.