일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- fragment
- 230508
- 230510
- querySelector
- DOMContentLoaded
- null-safety
- ViewPager
- javascript
- 부가데이터
- Adapter
- 인텐트
- 안드로이드
- putextra
- DFS
- Flutter
- Class
- 함수 인자
- C++
- 프래그먼트
- 데이터 타입
- string
- textContent
- 230503
- intent
- parcelable
- classList
- serializable
- ActionBar
- html
- 생명주기
- Today
- Total
나만의 개발노트
[안드로이드] 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
'[안드로이드] > [안드로이드] 공부 기록' 카테고리의 다른 글
[안드로이드] 서비스, startService, onStartCommand (0) | 2023.10.13 |
---|---|
[안드로이드] 수명주기/생명주기 (LifeCycle), getSharedPreferences() (0) | 2023.10.13 |
[안드로이드] 부가데이터(putExtra), 플래그(Flag) (1) | 2023.10.12 |
[안드로이드] 인텐트(intent) (1) | 2023.10.11 |
[안드로이드] 액티비티(Activity), 인텐트(Intent) - 화면전환 (1) | 2023.10.07 |