직렬화(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
아이콘을 클릭하세요. 목록에서 본인의 모바일 기기를 선택하면 기기에 기본 화면이 표시됩니다.


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

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