[안드로이드] Serializable, Parcelable
Serializable
: putExtra()로는 기본 자료형(Integer,String...)만 전달할 수 있음
-> 객체를 부가데이터로 전달할 수 있게 해주는 것
[특징]
- ArrayList와 같은 객체들은 이미 Serializable 인터페이스를 구현하고 있어서 그대로 부가데이터로 추가할 수 있음
- 메모리 용량을 많이 사용함
[사용법 - ArrayLIst예시]
1. MainActivity에 Intent와 ArrayList 만들기
//MainActivity.java
Intent intent = new Intent(getApplicationContext(),MenuActivity.class);
ArrayList<String> names = new ArrayList<>();
2. ArrayList를 부가데이터로 보내기
//MainActivity.java
intent.putExtra("names",names);
3. MenuActivity에서 getIntent()로 인텐트 받기
//MenuActivity.java
Intent passedIntent = getIntent();
#최종 MainActivity.java
package com.example.myparcelable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),MenuActivity.class);
ArrayList<String> names = new ArrayList<>();
names.add("유지민");
names.add("김민정");
intent.putExtra("names",names);
startActivity(intent);
}
});
}
}
#최종 MenuActivity.java
package com.example.myparcelable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MenuActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Intent passedIntent = getIntent();
//전달받은 ArrayList의 첫인덱스
String name = passedIntent.getStringArrayListExtra("names").get(0);
Toast.makeText(getApplicationContext(),name,Toast.LENGTH_LONG).show();
}
}
Parcelable
: 직접 정의한 객체를 부가데이터로 보낼 수 있게 도와주는 인터페이스
[특징]
- Serializable 보다 메모리 용량을 적게 사용함
[사용법 - SimpleData class 생성]
1. Project -> java -> 우클릭 new -> java class -> SimpleData.java클래스 생성
2. implements Parcelable하기
public class SimpleData implements Parcelable{
...
}
3. 우클릭 generate -> implement methods 모두 생성
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
}
4. SimpleData 객체에 들어갈 변수 선언 후 생성자 만들기
int number;
String message;
public SimpleData(int number, String message) {
this.number = number;
this.message = message;
}
5. Parcel로 SimpleData객체를 만들 수 있는 생성자도 만들기
public SimpleData(Parcel src){
number = src.readInt();
message = src.readString();
}
6. CREATOR field 만들기
public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){
@Override
public Object createFromParcel(Parcel source) {
return null;
}
@Override
public Object[] newArray(int size) {
return new Object[0];
}
};
-> 두 메소드 SimpleData전용으로 작성
public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){
//Parcel로 SimpleData객체 만들기
@Override
public SimpleData createFromParcel(Parcel source) {
return new SimpleData(source);
}
@Override
public SimpleData[] newArray(int size) {
return new SimpleData[size];
}
};
7. writeToParcel() 작성
//SimpleData객체 -> Parcel
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(number);
dest.writeString(message);
}
=====Parcelable 인터페이스를 사용한 클래스 SimpleData 작성완료=====
8. MainActivity에 SimpleData 객체 생성
SimpleData data = new SimpleData(112,"Hello");
9. SimpleData 객체 intent의 부가데이터로 넣기
intent.putExtra("data",data);
10. MenuActivity에서 Parcelable을 통해 SimpleData 객체 받기
//MenuActivity.java
Intent passedIntent = getIntent();
SimpleData data = (SimpleData) passedIntent.getParcelableExtra("data");
String message = data.message;
Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show();
#최종 SimpleData.java
package com.example.myparcelable;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.NonNull;
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(){
//Parcel로 SimpleData객체 만들기
@Override
public SimpleData createFromParcel(Parcel source) {
return new SimpleData(source);
}
@Override
public SimpleData[] newArray(int size) {
return new SimpleData[size];
}
};
@Override
public int describeContents() {
return 0;
}
//SimpleData객체 -> Parcel
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(number);
dest.writeString(message);
}
}
#최종 MainActivity.java (데이터 수신)
package com.example.myparcelable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),MenuActivity.class);
SimpleData data = new SimpleData(112,"Hello");
intent.putExtra("data",data);
startActivity(intent);
}
});
}
}
#최종 MenuActivity.java (데이터 발신)
package com.example.myparcelable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MenuActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Intent passedIntent = getIntent();
//전달받은 Parcel로 SimpleData객체 만들기
SimpleData data = (SimpleData) passedIntent.getParcelableExtra("data");
String message = data.message;
Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show();
}
}
[참고] 3-2강
안드로이드 앱 프로그래밍
부스트코스 무료 강의
www.boostcourse.org
https://velog.io/@jaeyunn_15/Android-Parcelable-vs-Serializable
[Android] Parcelable vs Serializable 우린 뭘 써야할까?
차이를 알고 쓰자.이 글은 Parcelable vs Serializable , 정말 Serializable은 느릴까? 해당 글을 읽고 작성 되었으며 일부를 참고하고 있습니다.평소 Object를 Intent를 통해 넘길 때 너무 자연스럽게도 parcelable
velog.io