본문 바로가기

안드로이드

데이터 전달, Parcelable

반응형
http://devstory.ibksplatform.com/2018/05/android-parcelable.html

 

Parcelable은 안드로이드에서 모델 클래스를 다룰 때 사용하는 Serializable의 한 분류이다.

 

일단 Serializable은 영어의 뜻은 직렬화, 안드로이드 시스템에서 동작하는 방식으로는

"A 액티비티에서 B 액티비티로 데이터를 전달할 때, 데이터를 묶어서 전달한다" 정도로 이해하면 될듯 하다

 

Parcel은 "소포", "꾸러미"라는 뜻을 가지고 있다. 안드로이드에서의 Parcel도 "여러 데이터가 하나의 꾸러미(Class) 안에 담겨 있다" 라는 의미를 가지게 된다

 

그래서 이 데이터 꾸러미가 A 액티비티에서 B 액티비티로 한꺼번에 전달되고 받아볼 수 있도록 해주는 것이 Parcelable이다

 

1. 클래스 정의

먼저 데이터(모델) 클래스를 하나 만든다

package com.example.a24_what_is_parcelable;

public class ProfileCls {
    String name;
    int age;
    String gender;
}

이 상태에서는 A 액티비티에서 B 액티비티로 데이터를 이동 시킬 수 없고, Parcelable을 적용한 후에 Intent를 이용하여 보내고 받을 수 있게 된다

 

2. Parcelable 적용

Parcelable은 인터페이스이므로, implements를 통하여 내부 메소드를 구현해야한다

package com.example.a24_what_is_parcelable;

import android.os.Parcel;
import android.os.Parcelable;

public class ProfileCls implements Parcelable {
    String name;
    int age;
    String gender;

    protected ProfileCls(Parcel in) {
        name = in.readString();
        age = in.readInt();
        gender = in.readString();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeString(gender);
    }

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

    public static final Creator<ProfileCls> CREATOR = new Creator<ProfileCls>() {
        @Override
        public ProfileCls createFromParcel(Parcel in) {
            return new ProfileCls(in);
        }

        @Override
        public ProfileCls[] newArray(int size) {
            return new ProfileCls[size];
        }
    };
}

writeToParcel은 객체가 직렬화되어 보내기 이전에 데이터를 직렬화 시켜주는 메소드이다

 

dest에 순차적으로 class 내부에 있는 데이터들을 저장시켜놓아야하므로 내부 메소드는 다음과 같아야한다

    public ProfileCls() {

    }
    
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeString(gender);
    }

이름, 나이, 성별 순서대로 Parcel에 담겨지게 되며, 각각 Data Type에 맞는 메소드로 작성하면 된다

참고한 블로그의 내용을 따라, 기본 생성자도 만들어주었다

 

여기서 끝이 아니고, 객체를 받았을 때 직렬화를 풀어주는 로직이 있어야한다

    protected ProfileCls(Parcel in) {
        name = in.readString();
        age = in.readInt();
        gender = in.readString();
    }

Parcel을 이용하여 보내게 되면, 받는 쪽에서도 Parcel을 통해서 데이터를 받기 때문에, 생성자를 통해 Parcel을 전달하게 된다.

 

CREATOR는 새로운 객체가 만들어지는 코드이다

    public static final Creator<ProfileCls> CREATOR = new Creator<ProfileCls>() {
        @Override
        public ProfileCls createFromParcel(Parcel in) {
            return new ProfileCls(in);
        }

        @Override
        public ProfileCls[] newArray(int size) {
            return new ProfileCls[size];
        }
    };

 

3. 사용

Parcelable로 된 클래스를 A 액티비티에서 B 액티비티로 보내기

package com.example.a24_what_is_parcelable;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        A 액티비티에서 Class 객체의 데이터를 구성한다
        ProfileCls profile = new ProfileCls();
        profile.name = "John Doe";
        profile.age = 29;
        profile.gender = "male";

//        Intent의 putExtra를 통해서 Parcelable class를 보낸다
        Intent intent = new Intent(this, SubActivity.class);
        intent.putExtra("parcel", profile);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    }
}

 

받는 쪽인 B 액티비티

package com.example.a24_what_is_parcelable;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;

public class SubActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);

//        putExtra를 통해서 보낼 데이터를 넣었으므로, 받을때도 getExtra 형태인 getParcelableExtra를 통해 데이터를 받는다
        Intent data = getIntent();
        ProfileCls profile = data.getParcelableExtra("parcel");
        System.out.println("이름 : " + profile.name);
        System.out.println("나이 : " + profile.age);
        System.out.println("성별 : " + profile.gender);
    }
}
반응형

'안드로이드' 카테고리의 다른 글

태스크 관리  (0) 2021.10.14
Paracelable 다른 참고 자료  (0) 2021.10.14
로그인 화면과 메뉴 화면 전환  (0) 2021.10.14
인텐트  (0) 2021.10.14
여러 화면 전환  (0) 2021.10.13