Kong돌이의 코딩이야기

Android Studio Parcelable 객체를 이용한 액티비티 간 데이터 전달 예제 본문

코딩이야기/안드로이드

Android Studio Parcelable 객체를 이용한 액티비티 간 데이터 전달 예제

Kong돌이 2021. 8. 30. 17:01
728x90

안녕하세요 오늘은 Android Studio Parcelable 객체를 이용하여 액티비티 간 데이터 전달하는 예제를 한번 진행해보려고 합니다!! 액티비티 간 데이터 전달은 굉장히 중요하죠! 예를 들어 로그인 후 로그인 화면에서 메인 화면으로 넘어갈 때 아이디 또는 이름 같은 경우를 사용자에게 노출시켜줘야 할 경우가 많습니다. 이런 경우 Parcelable 객체를 이용하여 데이터를 전달 할 수 있습니다. 시작해 볼까요?

 

우선 Android Studio 새로운 프로젝트를 생성해주세요

 

저희가 처음에 만들어야 할 건 main_Activity와 menu_Activity 그리고 SimpleData라는 new Java Class를 생성해주세요!!

 

Android app

다 만드셨나요?? 그럼 이제 SumpleData 클래스에 들어가 Parcelable 인터페이스를 구현해보겠습니다!!

다음과 같이 소스코드를 구현해주세요! 설명은 소스코드와 함께 있습니다!

package com.example.sampleparcelable;

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

public class SimpleData implements Parcelable {
// Parcelable 인터페이스를 구현
    int number;          //number, message 2가지의 변수를 지정해주었음
    String message;     // number = 정수 message = 문자열
    public SimpleData(int num, String msg){
        number = num;
        message = msg;
    }
    // Parcel 객체에서 읽기 (생성자)
    protected SimpleData(Parcel src) {
        number = src.readInt();
        message = src.readString();
        // Parcel 객체를 파라미터로 받게 된다.
        // 위 두가지 readInt, readString 메서드를 이용하여 데이터를 읽어들임
    }
    // Creator 객체는 상수로 정의되어 있으며 새로운 객체가 만들어지는 코드가 들어가므로
    // new = Creator<SimpleData>와 같이 SimpleData객체를 만드는 부분을 볼 수 있다.
    public static final Creator<SimpleData> CREATOR = new Creator<SimpleData>() {
        @Override
        public SimpleData createFromParcel(Parcel in) {
            return new SimpleData(in); // -- SimpleData 생성자를 호출해 Parcel 객체에서 읽기
        }
        @Override
        public SimpleData[] newArray(int size) {
            return new SimpleData[size];
        }
    };
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) { //-- Parcel 객체로 쓰기
        // writeToParcel = SimpleData 객체안에 들어있는 데이터를 Parcel 객체로 만드는 역할을 해줌
        // 이 메서드 안에서는 writeInt(), writeString() 2가지의 메서드를 사용함
        dest.writeInt(number);
        dest.writeString(message);
    }
}
// 마무리 코멘트 결과적으로 SimpleDAta클래스 안에 Parcel 객체의 데이터를 읽는 부분과
// Parcel 객체로 쓰는 부분을 정의하게 된다.

 

이제 MainActivity 소스 코드를 작성해 볼 텐데요 MainActivity.java파일을 열고 버튼을 클릭했을 때 MenuActivity를 뛰우는 코드를 추가합니다. MenuActivity를 띄우기 위해 만드는 인텐트 객체에는 SimpleData 객체를 부가 데이터로 넣어 전달할 것입니다. MainActivity 클래스 안에 다음과 같은 코드를 입력해주세요!!

 

package com.example.sampleparcelable;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    public static final int REQUEST_CODE_MENU = 101;
    public static final String KEY_SIMPLE_DATA = "data";

    Button btn_menu;


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

        btn_menu = findViewById(R.id.btn_menu);
        btn_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                SimpleData data = new SimpleData(100, "내이름은 콩진석!");
                // SimpleData 객체 생성
                // 클래스로 객체를 만드는 부분입니다. 이 부분을 보시면 new SimpleData(100, 내 이름은 ...)
                // 로 되어 있습니다. 따라서 정수는 100 문자열은 내 이름... 인 Parcel 객체로 만들어집니다.
                intent.putExtra(KEY_SIMPLE_DATA, data);
                // 인텐트에 부가 데이터로 넣기
                // 인텐트 객체의 putExtra 메서드를 사용해 SimpleData 객체를 부가 데이터로 추가했다면
                // SimpleData 객체는 메뉴 액티비티에서 꺼내어 사용할 수 있다.
                startActivityForResult(intent, REQUEST_CODE_MENU);
                // stratActivityForResult()를 활용

            }
        });

    }
}

마지막으로 메뉴 화면 소스코드를 작성해보도록 하겠습니다.

MenuActivity XML 레이아웃 파일인 Activity_menu.xml 파일을 열고 텍스트뷰 하나와 버튼 하나를 추가해주세요!!

텍스트뷰에는 "전달받은 데이터"라는 글자가 보이도록 text 속성을 설정합니다.

텍스트뷰에는 MainActivity로부터 전달받은 데이터를 보여줄 것입니다.

소스코드와 함께 설명 진행하도록 하겠습니다. 

 

package com.example.sampleparcelable;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MenuActivity extends AppCompatActivity {
    public static final String KEY_SIMPLE_DATA = "data";
    TextView tv_menu;
    Button btn_back;

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

        tv_menu = findViewById(R.id.tv_menu);
        btn_back = findViewById(R.id.btn_back);
        btn_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("name", "mike");
                setResult(RESULT_OK, intent);

                finish();
            }
        });
        // 메뉴 엑티비티로부터 전달 받은 인텐트 객체를 참조하기 위해 onCreate 메서드 안에서
        // getIntent() 메서드를 호출 했습니다. getIntent() 메서드를 호출하면 인텐트 객체가 반환되므로
        // 이 객체 안의 번들 객체를 참조할 수 있습니다.
        Intent intent = getIntent();
        procesIntent(intent);
    }

    private void procesIntent(Intent intent) {
        if(intent != null) {
            // getExtras() 메서드를 호출하면 Bundle 자료형의 객체가 반환됩니다.
            // 이렇게 객체를 참조한 후 getOOO() 형태의 메서드를 사용해도 되고, 번들 객체를 참조하지 않고
            // 인텐트 객체에 정의되어 있는 getOOOExtra()형태의 메서드를 사용해도 됩니다.
            Bundle bundle = intent.getExtras();
            SimpleData data = bundle.getParcelable(KEY_SIMPLE_DATA);
            // 번들 객체안에 SimpleData 객체가 들어 있으므로 getParcelable 메서드로 객체를 참조합니다.
            // 번들 객체에 데이터를 저장하기 위한 키(KEY)는 메인 액티비티와 또 다른 액티비티 모두
            // KEY_SIMPLE_DATA라는 같은 이름의 상수로 정의되어 있습니다.
            if (intent != null) {
                tv_menu.setText("전달 받은 데이터\nnNumber :" + data.number
                + "\nMessage : " + data.message);
                // 텍스트에 전달 받은 Number과 Message를 보여줍니다.
            }
        }
    }
}

이제 main_Activity와 menu_Activity 그리고 SimpleData라는 new Java Class에 들어갈 소스코드를 다 작성했으니 앱을 실행하도록 하겠습니다!!

 

mainActivity

MainActivity 화면입니다. 메인 액티비티의 [메뉴 화면 띄우기] 버튼을 누르게 되면 새로 추가한 메뉴 화면이 뜹니다.

그리고 화면에는 인텐트 안의 번들 객체에 넣어 전달한 SimpleData객체의 정보가 나타납니다. 버튼을 클릭해보겠습니다!!

 

MenuActivity

 

자 이렇게 Parcelable 인터페이스를 사용하면 객체를 정의해 데이터를 전달할 수 있으므로 코드가 좀 더 단순해지고 재사용성이 높아지는 장점이 생기게 됩니다. 하지만 데이터를 담아둘 새로운 객체를 일일이 정의하는 것이 번거롭다는 단점도 있습니다.

 

Android Studio Parcelable 객체를 이용한 액티비티 간 데이터 전달 예제를 진행해 보았습니다.

이상으로 마치도록 해보겠습니다.!!

 

728x90
반응형
LIST
Comments