Android에서 Intent를 사용한 객체 전달 및 결과 반환

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();
    }
}

태그: Android Intent parcelable

6월 1일 03:19에 게시됨