재훈재훈
Intent로 데이터 전달하기 본문
임의의 액티비티에서 다른 액티비티로 넘어갈 때 데이터를 전달해야 할 때가 있다.
이럴 경우 보통 인텐트 안에 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();
}
}
}
'Computer Engineering > Android' 카테고리의 다른 글
FLAG_ACTIVITY_FORWARD_RESULT - 세번째 액티비티에서 첫번째 액티비티로 결과 전달하기 (0) | 2018.04.15 |
---|---|
고객 정보 입력 화면 만들기 예제 (1) | 2018.04.15 |
프래그먼트(Fragment) (0) | 2018.04.09 |
SMS 문자 전송 화면 만들기 예제 ver.2 - 최대 바이트 수 제한 기능 (0) | 2018.04.07 |
SMS 문자 전송 화면 만들기 예제 ver.1 - 글자 길이 제한 기능 (0) | 2018.04.07 |