Android 개발에서 Activity 간 데이터 교환은 매우 중요한 부분입니다. Intent는 Activity 간 이동과 동시에 데이터를 전달하는 데 사용됩니다. 여기서는 Intent를 통해 객체를 전달하고 새로운 Activity로부터 데이터를 다시 받는 방법을 설명하겠습니다. 두 가지 방식이 있으며, 각각 Parcelable과 Serializable 인터페이스를 활용합니다.
먼저, Parcelable을 구현한 클래스 예제입니다:
package com.example.intentexample;
import android.os.Parcel;
import android.os.Parcelable;
public class Member implements Parcelable {
private String nickname;
private String role;
private int level;
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
protected Member(Parcel in) {
nickname = in.readString();
role = in.readString();
level = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(nickname);
dest.writeString(role);
dest.writeInt(level);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Member> CREATOR = new Creator<Member>() {
@Override
public Member createFromParcel(Parcel in) {
return new Member(in);
}
@Override
public Member[] newArray(int size) {
return new Member[size];
}
};
}
다음으로 Serializable을 구현한 클래스입니다:
package com.example.intentexample;
import java.io.Serializable;
public class Teammate implements Serializable {
private String name;
private String position;
private int experience;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
public int getExperience() {
return experience;
}
public void setExperience(int experience) {
this.experience = experience;
}
}
다음은 MainActivity에서의 구현입니다:
package com.example.intentexample;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ArrayList<Member> members = new ArrayList<>();
private ArrayList<Teammate> teammates = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnParcelable = findViewById(R.id.btn_parcelable);
Button btnSerializable = findViewById(R.id.btn_serializable);
btnParcelable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendParcelableData();
}
});
btnSerializable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendSerializableData();
}
});
}
private void sendParcelableData() {
Member member = new Member();
member.setNickname("ParcelUser");
member.setRole("Leader");
member.setLevel(10);
members.add(member);
Intent intent = new Intent(this, ParcelableActivity.class);
intent.putParcelableArrayListExtra("members", members);
startActivityForResult(intent, 101);
}
private void sendSerializableData() {
Teammate teammate = new Teammate();
teammate.setName("SerialUser");
teammate.setPosition("Developer");
teammate.setExperience(5);
teammates.add(teammate);
Intent intent = new Intent(this, SerializableActivity.class);
intent.putExtra("teammates", teammates);
startActivityForResult(intent, 201);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data == null) return;
TextView textView = findViewById(R.id.textView);
if (requestCode == 101 && resultCode == RESULT_OK) {
members = data.getParcelableArrayListExtra("members");
StringBuilder sb = new StringBuilder("Members: \n");
for (Member member : members) {
sb.append(member.getNickname()).append(", ").append(member.getRole()).append("\n");
}
textView.setText(sb.toString());
} else if (requestCode == 201 && resultCode == RESULT_OK) {
teammates = (ArrayList<Teammate>) data.getSerializableExtra("teammates");
StringBuilder sb = new StringBuilder("Teammates: \n");
for (Teammate teammate : teammates) {
sb.append(teammate.getName()).append(", ").append(teammate.getPosition()).append("\n");
}
textView.setText(sb.toString());
}
}
}
다음은 ParcelableActivity입니다:
package com.example.intentexample;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
public class ParcelableActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
ArrayList<Member> members = getIntent().getParcelableArrayListExtra("members");
StringBuilder sb = new StringBuilder("Received Members:\n");
for (Member member : members) {
sb.append(member.getNickname()).append(", ").append(member.getRole()).append("\n");
}
textView.setText(sb.toString());
setContentView(textView);
}
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putParcelableArrayListExtra("members", getIntent().getParcelableArrayListExtra("members"));
setResult(RESULT_OK, intent);
finish();
}
}
마지막으로 SerializableActivity입니다:
package com.example.intentexample;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
public class SerializableActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
ArrayList<Teammate> teammates = (ArrayList<Teammate>) getIntent().getSerializableExtra("teammates");
StringBuilder sb = new StringBuilder("Received Teammates:\n");
for (Teammate teammate : teammates) {
sb.append(teammate.getName()).append(", ").append(teammate.getPosition()).append("\n");
}
textView.setText(sb.toString());
setContentView(textView);
}
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("teammates", getIntent().getSerializableExtra("teammates"));
setResult(RESULT_OK, intent);
finish();
}
}