티스토리 뷰
흔히 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를 포함한 경우에도 모두 전달이 가능하다.