티스토리 뷰

흔히 Activity간에 데이터를 전달 할 경우, 특별한 경우가 아니면 간단하게 putExtra를 사용해서 Activity간에 데이터를 전달하는 방법을 사용한다.


문제는 이러한 방법을 사용 할 경우, 한정된 데이터형만을 사용 할 수 있는데, 사용자가 클래스로 만든 Object형을 Intent로 전달할 수 있는 방법을 공유하고자 한다.


일반적인 방법으로는 Custom Object형을 전달 할 수 없다.


이를 가능하기 위해서는 Serializable나 Parcelable을 Custom Object에서 구현시켜 주어야 한다.


여기서는 Parcelable를 사용한 방법을 소개하겠다.


public class CustomObject {

  private int a;

  private int b;

  private Strirng c;


  public CustomObject(int a, int b, String c) {

    this.a = a;

    this.b = b;

    this.c = c;

  }

}

(Getter와 Setter는 생략, 필요하다면 추가해주면 된다.)


이러한 클래스가 있다고 할 때, 이곳에 간단히 Parcelable을 구현하기만 하면 된다.


public class CustomObject implements Parcelable {

  private int a;

  private int b;

  private Strirng c;


  // Parcelable을 구현하는 코드, 반드시 아래의 코드들은 추가해주어야 한다.

  // Parcelable 구조체에서 CsutomObject로 읽어오는 함수.

  public CustomObject(Parcelable in) {

    this.a = in.getInt();

    this.b = in.getInt();

    this.c = in.getString();

  }

  // Parcelable 구조체에 기록하는 함수.

  // 주의 할 점은 반드시 생성자에서 읽어오는 순서와, 기록하는 순서가 같아야 한다.

  public void wirteToParcel(Parcel dest, int flags) {

    dest.writeInt(this.a);

    dest.writeInt(this.b);

    dest.writeString(this.c);

  }

  // 아래 함수는 구현시 자동으로 생성되는 함수로 별로 신경쓰지 않아도 된다.

  public int describeContents() {

    return 0;

  }

  // Parcelable을 생성하는 코드. 반드시 추가해주어야 한다.

  public static final Parcelable.Creator<CustomObject> CREATOR = new Parcelable.Creator<CustomObject>() {

    public CustomObject createFromParcel(Parcel in) {

      return new CustomObject(in);

    }

    public CustomObject[] newArray (int size) {

      return new CustomObject[size];

    }

  };

  

  public CustomObject(int a, int b, String c) {

    this.a = a;

    this.b = b;

    this.c = c;

  }

}


이제 클래스의 선언은 모두 끝났다.


다음으로 사용법에 대해서 알아보자.


사용법은 더욱 더 간단하다.


A 엑티비티에서 B 엑티비티로 Custom Object를 전달을 원할 경우,

CustomObject event = new CustomObject(1, 2, "test");

Intent i = new Intent(this, B.class);

i.putExtra("event_name", event);

startActivity(i);


B 엑티비티에서는

CustomObject event = (CustomObject)getIntent().getParcelableExtra("event");

이렇게 전달 받으면 된다.


CustomObject 내부에 ArrayList를 포함한 경우, 비슷한 방법으로 계층 구조를 이루어 주면 ArrayList를 포함한 경우에도 모두 전달이 가능하다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크