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

안드로이드에서 메인 액티비티로 데이터를 되돌려 보내는 방법

개요

이 글에서는 안드로이드에서 두 번째 액티비티(서브 액티비티)의 연산 결과를 메인 액티비티로 되돌려 보내는 방법을 실전 예제와 함께 단계별로 살펴봅니다. 사용자가 숫자 두 개를 입력하면 두 번째 액티비티에서 덧셈 또는 뺄셈을 수행하고, 그 결과가 다시 메인 화면에 표시되는 구조입니다.


핵심 API 정리

액티비티 사이에서 결과 데이터를 주고받으려면 다음 세 가지 메서드가 핵심입니다.

- startActivityForResult(intent, requestCode) : 결과를 기대하며 새 액티비티를 실행합니다.
- setResult(resultCode, intent) : 호출된 액티비티가 결과 데이터를 담아 종료할 때 사용합니다.
- onActivityResult(requestCode, resultCode, data) : 메인 액티비티가 반환된 결과를 수신해 처리합니다.


1단계 : 새 프로젝트 생성

Android Studio에서 File ⇒ New Project를 선택하고, 필요한 항목을 모두 입력해 새 프로젝트를 생성합니다.

2단계 : activity_main.xml 레이아웃 작성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다. 레이아웃은 숫자를 입력받는 EditText 두 개, 결과를 표시하는 TextView, 두 번째 액티비티를 여는 Button으로 구성됩니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editTextNumber1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Number 1"
        android:inputType="number" />

    <EditText
        android:id="@+id/editTextNumber2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Number 2"
        android:inputType="number" />

    <TextView
        android:id="@+id/textViewResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Result"
        android:textSize="30sp" />

    <Button
        android:id="@+id/btnOpenActivity2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="open activity 2" />

</LinearLayout>

3단계 : MainActivity.java 작성

src/MainActivity.java에 아래 코드를 추가합니다. 버튼 클릭 시 입력값이 비어 있는지 검증한 뒤 startActivityForResult()로 SecondActivity를 호출하고, onActivityResult() 콜백에서 돌아온 결과를 받아 화면에 출력합니다.

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

public class MainActivity extends AppCompatActivity {
    private TextView textViewResult;
    private EditText editTextNumber1;
    private EditText editTextNumber2;
    Button btnOpen;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textViewResult = findViewById(R.id.textViewResult);
        editTextNumber1 = findViewById(R.id.editTextNumber1);
        editTextNumber2 = findViewById(R.id.editTextNumber2);
        btnOpen = findViewById(R.id.btnOpenActivity2);

        btnOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (editTextNumber1.getText().toString().equals("")
                        || editTextNumber2.getText().toString().equals("")) {
                    Toast.makeText(MainActivity.this, "Please insert numbers", Toast.LENGTH_SHORT).show();
                } else {
                    int number1 = Integer.parseInt(editTextNumber1.getText().toString());
                    int number2 = Integer.parseInt(editTextNumber2.getText().toString());
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    intent.putExtra("number1", number1);
                    intent.putExtra("number2", number2);
                    startActivityForResult(intent, 1);
                }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                int result = data.getIntExtra("result", 0);
                textViewResult.setText("" + result);
            }
            if (resultCode == RESULT_CANCELED) {
                textViewResult.setText("Nothing selected");
            }
        }
    }
}

4단계 : SecondActivity 추가

새 액티비티를 생성한 뒤 아래와 같이 작성합니다. 인텐트로 전달받은 두 숫자를 TextView에 표시하고, add 또는 subtract 버튼 클릭 시 계산 결과를 setResult()에 담아 반환한 후 finish()로 액티비티를 종료합니다.

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textViewNumbers"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Numbers: "
        android:textSize="30sp" />

    <Button
        android:id="@+id/buttonAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="add" />

    <Button
        android:id="@+id/buttonSubtract"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="subtract" />

</LinearLayout>

SecondActivity.java

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

public class SecondActivity extends AppCompatActivity {
    TextView textViewNumber;
    Button buttonAdd, buttonSubtract;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent intent = getIntent();
        final int number1 = intent.getIntExtra("number1", 0);
        final int number2 = intent.getIntExtra("number2", 0);

        textViewNumber = findViewById(R.id.textViewNumbers);
        textViewNumber.setText("Numbers: " + number1 + ", " + number2);

        buttonAdd = findViewById(R.id.buttonAdd);
        buttonSubtract = findViewById(R.id.buttonSubtract);

        buttonAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int result = number1 + number2;
                Intent resultIntent = new Intent();
                resultIntent.putExtra("result", result);
                setResult(RESULT_OK, resultIntent);
                finish();
            }
        });

        buttonSubtract.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int result = number1 - number2;
                Intent resultIntent = new Intent();
                resultIntent.putExtra("result", result);
                setResult(RESULT_OK, resultIntent);
                finish();
            }
        });
    }
}

5단계 : AndroidManifest.xml에 액티비티 등록

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

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

    <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=".SecondActivity"></activity>

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

    </application>

</manifest>

실행 결과 확인

실제 안드로이드 기기를 컴퓨터에 연결한 상태라고 가정하고 앱을 실행해 보겠습니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 실행 대상으로 자신의 모바일 기기를 선택하면 아래와 같은 기본 화면이 표시됩니다.

안드로이드에서 메인 액티비티로 데이터를 되돌려 보내는 방법

안드로이드에서 메인 액티비티로 데이터를 되돌려 보내는 방법


안드로이드에서 메인 액티비티로 데이터를 되돌려 보내는 방법


참고 : 최신 권장 방식

위 예제에 사용된 startActivityForResult()와 onActivityResult()는 현재 공식적으로 지원이 중단(deprecated)된 API입니다. AndroidX 기반의 새 프로젝트라면 Activity Result API(registerForActivityResult)를 사용하는 것이 권장되므로, 실무 개발 시에는 이를 활용하는 것이 좋습니다. 다만 동작 원리 자체는 동일하기 때문에, 본 예제는 액티비티 간 결과 전달 흐름을 이해하는 데 충분히 유용합니다.