Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

재훈재훈

Intent로 데이터 전달하기 본문

Computer Engineering/Android

Intent로 데이터 전달하기

jaehoonx2 2018. 4. 7. 17:52

임의의 액티비티에서 다른 액티비티로 넘어갈 때 데이터를 전달해야 할 때가 있다.

이럴 경우 보통 인텐트 안에 Extra data를 넣어 전달하면 되는데 크게 두 가지 경우로 나뉜다.


1. 데이터의 타입이 기본형(Primitive data type)일 경우

putExtra()로 보내고 getIntExtra(), getBooleanExtra(), getStringExtra() 등 getOOOExtra(해당 데이터 타입)로 받는다.


2. 데이터 타입이 객체일 경우

- 직렬화

- Parcelable 인터페이스



오늘은 Intent를 통해 보내야 할 데이터의 타입이 객체일 경우에 대해서 포스팅한다.




1. 직렬화를 통한 객체형 타입 데이터 전달

자바에서 직렬화(Serialization)란, 객체를 데이터 스트림으로 만드는 것을 의미한다. 즉 객체에 저장되어 있는 데이터(인스턴스 변수)를 스트림에 쓰기 위해 serial한 데이터로 바꾼다. 객체 속 인스턴스 변수들을 일렬로 만드는 것!




MainActivity.java (데이터를 보낼 액티비티)

...
Intent intent = new Intent(getApplicationContext(), MenuActivity.class);

ArrayList<String> names = new ArrayList<String>();    // 인텐트를 통해 전달할 객체
names.add("김진수");
names.add("황수현");

intent.putExtra("names", names);
...

MenuActivity.java (데이터를 받을 액티비티)


...
if(intent != null) {
ArrayList<String> names = (ArrayList<String>) intent.getSerializableExtra("names");
if(names != null) {
Toast.makeText(getApplicationContext(), "전달 받은 이름 리스트 갯수 : " + names.size(), Toast.LENGTH_LONG).show();
}
...



2. Parcelable 인터페이스를 통한 객체형 타입 데이터 전달

첫번째 방법과 유사한 방법이지만 크기가 훨씬 작아 더 자주 사용되는 방법이다. Parcelable 인터페이스를 구현해야 하며 아래 두 메서드를 필히 구현해야 한다.

- public abstract int describeContents()

- public abstract void writeToParcel()        // 데이터를 Parcel 객체로 만드는 역할




SimpleData.java (Parcel 인터페이스를 구현한 SimpleData 클래스)



public class SimpleData implements Parcelable {

int number;
String message;

public SimpleData(int number, String message) {
this.number = number;
this.message = message;
}

public SimpleData(Parcel src){
number = src.readInt();
message = src.readString();
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){        // CREATER 객체
public SimpleData createFromParcel(Parcel src) {                               // 데이터 읽고 쓰는 부분 정의
return new SimpleData(src);
}

public SimpleData[] newArray(int size) {
return new SimpleData[size];
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(number);
dest.writeString(message);
}
}


MainActivity에서 이 SimpleData를 MenuActivity로 보낼 것이다.



MainActivity.java


...

Intent intent = new Intent(getApplicationContext(), MenuActivity.class);

SimpleData data = new SimpleData(100, "Hello");
intent.putExtra("data", data); // 객체를 넣을 수 있게 되었다

startActivityForResult(intent, 101);

...




MenuActivity.java


...

Intent passedIntent = getIntent();
processIntent(passedIntent);

...

private void processIntent(Intent intent){
if(intent != null) {
ArrayList<String> names = (ArrayList<String>) intent.getSerializableExtra("names");
if(names != null) {
Toast.makeText(getApplicationContext(), "전달 받은 이름 리스트 갯수 : " + names.size(), Toast.LENGTH_LONG).show();
}

SimpleData data = intent.getParcelableExtra("data");
if(data != null) {
Toast.makeText(getApplicationContext(), "전달 받은 SimpleData : " + data.message, Toast.LENGTH_LONG).show();
}
}
}