티스토리 뷰

 Intent객체가 가지고 있는 putExtra메서드로 여로 타입의 부가 데이터를 넣어 다른 액티비티로 전달할 수 있다.

기본적으로 put/get Extra는 key와 value 쌍으로 데이터를 전달하지만 Object 타입의 경우, 객체 자체를 전달하는 것은 불가능하다. 

 

따라서 Serializable 인터페이스를 구현하는 객체를 만들어 직렬화를 해준 다음 전달해야하는데, 안드로이드는 Serializable 인터페이스와 유사한 Parcelable 인터페이스를 권장한다.

 

Parcelable 인터페이스는 Serializable과 유사하지만, 직렬화했을 때 크기가 작아 안드로이드 내부의 데이터를 전달할 때 주로 사용된다.

 

간단한 예제를 살펴보자.


우선, Intent에 넣어서 액티비티에 전달할 SimpleData클래스를 작성한다. 

이때, putExtra() 메서드로 Intent가 해당 객체를 읽고 쓸 수 있도록 Parcelable 인터페이스를 아래와 같이 구현 받고, read/write를 위한 메서드들을 재정의 해준다.

 

◎SimpleData.java

package com.example.simpleparcelable;

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

public class SimpleData implements Parcelable {

    int number;
    String message;

    public SimpleData(int num, String msg) {
        number = num;
        message = msg;
    }

    // Parcel 객체에서 읽기
    public SimpleData(Parcel src) {
        number = src.readInt();
        message = src.readString();
    }

    @Override
    //Parcel 객체로 쓰기
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(number);
        dest.writeString(message);
    }

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

    //CREATOR 상수 정의
    public static final Creator<SimpleData> CREATOR = new Creator<SimpleData>() {

        @Override
        //SimpleData 생성자를 호출해 Parcel 객체에서 읽기
        public SimpleData createFromParcel(Parcel in) {
            return new SimpleData(in);
        }

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

이제 액티비티 간 데이터 전달이 잘 되는 지 확인해보자.

 

◎activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <Button
            android:text="Button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/button"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintVertical_bias="0.588" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.498"/>
</androidx.constraintlayout.widget.ConstraintLayout>

◎MainActivity.java

package com.example.simpleparcelable;

import android.content.Intent;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    public static final String KEY_SIMPLE_DATA = "data";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        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(100, "Hello Choonham");
                intent.putExtra(KEY_SIMPLE_DATA, data);
                startActivity(intent);
            }
        });
    }
}

 

◎activity_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MenuActivity">

    <Button
            android:text="Button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/button2"
            app:layout_constraintBottom_toBottomOf="parent"
            android:layout_marginBottom="224dp" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"/>
    <TextView
            android:text="TextView"
            android:layout_width="0dp"
            android:layout_height="126dp" android:id="@+id/textView"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@+id/button2"/>
</androidx.constraintlayout.widget.ConstraintLayout>

 

◎MenuActivity.java

package com.example.simpleparcelable;

import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MenuActivity extends AppCompatActivity {
    public static final String KEY_SIMPLE_DATA = "data";
    TextView textView;

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

        textView = findViewById(R.id.textView);
        Button button = findViewById(R.id.button2);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                finish();
            }
        });

        Intent intent = getIntent();
        processIntent(intent);
    }

    private void processIntent(Intent intent) {
        if(intent != null) {
            Bundle bundle = intent.getExtras();
            SimpleData data = bundle.getParcelable(KEY_SIMPLE_DATA);
            textView.setText("전달 받은 데이터\nNumber:" + data.number + "\nMessage: " + data.message);

        }
    }
}

 

간단하게, 액티비티를 하나 생성하여 intent로 SimpleData 객체를 넘겨준 뒤 확인해보는 예제를 작성했다.


 

Comments