Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드에서 Serializable을 활용해 액티비티 간 객체(데이터) 전달하는 방법

직렬화(Serialization)를 활용하면 두 개의 액티비티 사이에서 객체의 상태나 배열을 손쉽게 전달할 수 있습니다. 코드를 살펴보기 전에, 직렬화가 무엇인지 그리고 안드로이드에서 인텐트(Intent)와 함께 어떻게 동작하는지 먼저 이해하는 것이 좋습니다.

직렬화(Serialization)란?

직렬화는 마커 인터페이스(marker interface)입니다. 직렬화를 사용하면 객체의 상태를 바이트 스트림(byte stream)으로 변환할 수 있는데, 이 바이트 스트림은 플랫폼에 독립적이기 때문에 JVM은 물론 다른 플랫폼에서도 문제없이 동작합니다.

아래 예제는 두 액티비티 사이에서 객체를 주고받는 과정을 단계별로 보여줍니다.

1단계 — 새 프로젝트 생성

Android Studio에서 File → New Project를 선택한 뒤, 필요한 항목을 모두 입력하여 새 프로젝트를 생성합니다.

2단계 — 레이아웃 작성(activity_main.xml)

res/layout/activity_main.xml 파일에 다음 코드를 추가합니다. 이름과 전화번호를 입력받는 EditText 두 개와 데이터를 전송하는 Button 하나로 구성되어 있습니다.

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android = "https://schemas.android.com/apk/res/android" xmlns:tools = "https://schemas.android.com/tools" android:layout_width = "match_parent"
    android:layout_height = "match_parent">
<LinearLayout
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:gravity = "center_horizontal"
    android:orientation = "vertical">
    <EditText
        android:id = "@+id/name"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:ems = "10"
        android:hint = "Enter a name"
        android:inputType = "text" />
    <EditText
        android:id = "@+id/phone"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:ems = "10"
        android:hint = "Enter a Phone number"
        android:inputType = "number"/>
    <Button
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text = "Send data"
        android:id = "@+id/send"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>

3단계 — MainActivity 구현

다음은 수정된 메인 액티비티 파일(MainActivity.java)의 내용입니다. 이 파일에는 액티비티의 기본 생명주기 메서드들이 포함될 수 있습니다. 버튼 클릭 시 입력값 검증 후, Userinfo 객체에 데이터를 담아 Bundle을 통해 SecondActivity로 전달합니다.

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
    EditText name;
    EditText phone;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        name = findViewById(R.id.name);
        phone = findViewById(R.id.phone);
        Button send = findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (TextUtils.isEmpty(name.getText().toString()) && TextUtils.isEmpty(phone.getText().toString())) {
                    Toast.makeText(MainActivity.this,"Something is wrong kindly check",Toast.LENGTH_LONG).show();
                }else{
sendUserData(name.getText().toString(),phone.getText().toString());
                }
            }
        });
    }
    private void sendUserData(String username, String userPhone) {
        Userinfo userinfo = new Userinfo();
        userinfo.setName(username);
        userinfo.setPhone(userPhone);
        Intent send = new Intent(MainActivity.this,SecondActivity.class);
        Bundle b = new Bundle();
        b.putSerializable("serialzable",userinfo);
        send.putExtras(b);
        startActivity(send);
    }
}

4단계 — SecondActivity 구현

다음은 두 번째 액티비티 파일(SecondActivity.java)의 내용입니다. 이 액티비티는 MainActivity에서 전달된 객체를 getSerializableExtra()로 꺼내 화면에 표시합니다.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class SecondActivity extends AppCompatActivity {
    Userinfo userinfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        TextView data = findViewById(R.id.data);
        userinfo = (Userinfo) getIntent().getSerializableExtra("serialzable");
        String name = userinfo.getName();
        String phone = userinfo.getPhone();
        data.setText("Your entered name is "+name+" number is "+phone);
    }
    @Override
    protected void onPause() {
        super.onPause();
        userinfo = null;
    }
}

5단계 — Serializable 객체(Userinfo) 정의

다음은 MainActivity와 SecondActivity 사이에서 전달되는 직렬화 가능한 Userinfo 객체입니다. 객체를 직렬화 대상으로 만들려면 반드시 java.io.Serializable 인터페이스를 구현(implements)해야 합니다.

import java.io.Serializable;
class Userinfo implements Serializable {
    String name;
    String phone;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
}

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 안드로이드에서 Serializable을 활용해 액티비티 간 객체(데이터) 전달하는 방법 아이콘을 클릭하세요. 목록에서 본인의 모바일 기기를 선택하면 기기에 기본 화면이 표시됩니다.

안드로이드에서 Serializable을 활용해 액티비티 간 객체(데이터) 전달하는 방법


안드로이드에서 Serializable을 활용해 액티비티 간 객체(데이터) 전달하는 방법

이름과 전화번호를 입력한 뒤 Send data 버튼을 누르면, 아래와 같이 SecondActivity로 이동합니다.

안드로이드에서 Serializable을 활용해 액티비티 간 객체(데이터) 전달하는 방법

위 출력 결과에서 확인할 수 있듯이, MainActivity에서 입력한 정보가 Serializable 객체를 통해 SecondActivity로 성공적으로 전달되었습니다.