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

안드로이드에서 한 액티비티에서 다른 액티비티로 객체를 전달하는 방법

이 튜토리얼에서는 안드로이드 앱에서 한 액티비티(Activity)에서 다른 액티비티로 커스텀 객체(Object)를 전달하는 방법을 단계별로 살펴봅니다. 인텐트(Intent)에 직렬화(Serializable)된 객체를 담아 전달하고, 수신 측 액티비티에서 이를 꺼내 화면에 표시하는 전체 과정을 코드 예제와 함께 설명합니다.

1단계: 새 프로젝트 생성

안드로이드 스튜디오(Android Studio)를 실행한 뒤, 메뉴에서 File ⇒ New Project를 선택하고 새 프로젝트 생성에 필요한 모든 정보를 입력하여 프로젝트를 만듭니다.

2단계: 메인 레이아웃 작성 (activity_main.xml)

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다. 화면 중앙에 버튼 하나가 배치되며, 이 버튼을 누르면 객체와 함께 두 번째 액티비티로 이동하게 됩니다.

<?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"
    tools:context=".MainActivity">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click here to pass object to Second Activity!"
        android:id="@+id/button"
        android:layout_centerInParent="true" />
</RelativeLayout>

3단계: 데이터 클래스 생성 (Character.java)

전달할 객체의 모델 역할을 할 자바 클래스를 생성합니다. 여기서는 Serializable 인터페이스를 구현하는 것이 핵심입니다. 객체를 인텐트로 전달하려면 반드시 직렬화가 가능해야 하기 때문입니다.

Character.java에 아래 코드를 작성합니다.

import java.io.Serializable;
public class Character implements Serializable {
    String name, Proffession, Position;
    String[] abilities;
    public Character(String name, String proffession, String position, String[] abilities) {
        this.name = name;
        Proffession = proffession;
        Position = position;
        this.abilities = abilities;
    }
}

이 클래스는 이름(name), 직종(Proffession), 포지션(Position), 능력(abilities) 네 가지 정보를 담는 단순한 데이터 모델입니다.

4단계: MainActivity에서 객체 전달하기

MainActivity.java에 아래 코드를 추가합니다. 버튼 클릭 시 Intent를 생성하고, putExtra() 메서드를 사용해 Character 객체를 첨부한 뒤 두 번째 액티비티를 시작합니다.

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                Character sports = new Character("CR7", "Football", "Left Winger", new String[]{"Best Freeckicker in the World"});
                intent.putExtra("Character", sports);
                startActivity(intent);
            }
        });
    }
}

5단계: 두 번째 액티비티에서 객체 수신하기

새로운 Empty Activity를 생성하고 이름을 SecondActivity로 지정한 뒤, SecondActivity.java에 아래 코드를 작성합니다. getSerializableExtra() 메서드로 전달받은 객체를 복원하고, TextView에 내용을 출력합니다.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.Arrays;
public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Character sports = (Character)getIntent().getSerializableExtra("Character");
        TextView textView = findViewById(R.id.textView);
        textView.setText(sports.name +"
" + sports.Proffession + "
" + sports.Position+ "
" + Arrays.toString(sports.abilities));
    }
}

6단계: 두 번째 레이아웃 작성 (activity_second.xml)

activity_second.xml 파일에 아래 코드를 추가합니다. 전달받은 객체의 데이터를 표시할 TextView를 화면 중앙에 배치합니다.

<?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"
    tools:context=".SecondActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:textSize="20sp"
        android:layout_centerInParent="true"/>
</RelativeLayout>

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 결과를 확인해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 연결했다고 가정합니다. 안드로이드 스튜디오에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 상단 툴바의 Run(실행) 아이콘을 클릭하세요. 옵션 목록에서 자신의 모바일 기기를 선택하면, 기본 화면이 표시됩니다.

안드로이드에서 한 액티비티에서 다른 액티비티로 객체를 전달하는 방법

버튼을 클릭하면 두 번째 액티비티로 이동하면서, 전달된 객체의 이름·직종·포지션·능력 정보가 아래와 같이 화면에 출력되는 것을 확인할 수 있습니다.

안드로이드에서 한 액티비티에서 다른 액티비티로 객체를 전달하는 방법

참고: Serializable과 Parcelable

객체를 인텐트로 전달하는 방법은 Serializable 외에도 Parcelable이 있습니다. Serializable은 구현이 간단하지만 리플렉션을 사용하기 때문에 속도가 느린 편이고, Parcelable은 코드 작성량이 많지만 성능이 뛰어나 안드로이드 공식 문서에서도 권장하는 방식입니다. 소량의 데이터나 간단한 프로토타이핑에는 Serializable, 대용량 데이터나 빈번한 전송에는 Parcelable을 사용하는 것이 좋습니다.