การส่งอ็อบเจกต์ (Object) ระหว่าง Activity ใน Android
ตัวอย่างนี้สาธิตวิธีส่งอ็อบเจกต์แบบกำหนดเอง (Custom Object) จาก Activity หนึ่งไปอีก Activity ผ่าน Intent โดยทำให้คลาส Implement Serializable
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
เปิด Android Studio เลือก File → New Project และกรอกข้อมูลที่จำเป็น
ขั้นตอนที่ 2: จัดทำ Layout Activity หลัก (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ส่ง Object ไป Second Activity"
android:id="@+id/button"
android:layout_centerInParent="true" />
</RelativeLayout>
ขั้นตอนที่ 3: สร้างคลาส Model (Character.java) - ต้อง Implement Serializable
import java.io.Serializable;
public class Character implements Serializable {
// serialVersionUID แนะนำให้กำหนดไว้ เพื่อความเข้ากันได้เวลา deserialize
private static final long serialVersionUID = 1L;
String name;
String profession;
String position;
String[] abilities;
public Character(String name, String profession, String position, String[] abilities) {
this.name = name;
this.profession = profession;
this.position = position;
this.abilities = abilities;
}
// Getter methods (แนะนำ)
public String getName() { return name; }
public String getProfession() { return profession; }
public String getPosition() { return position; }
public String[] getAbilities() { return abilities; }
}
ขั้นตอนที่ 4: เขียนโค้ด MainActivity.java
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@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) {
// สร้าง Object
Character character = new Character(
"CR7",
"Football",
"Left Winger",
new String[]{"Best Free kicker in the World", "Heading", "Speed"}
);
// ส่งผ่าน Intent
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Character", character);
startActivity(intent);
}
});
}
}
ขั้นตอนที่ 5: สร้าง SecondActivity และ Layout
คลิกขวาที่ package → New → Activity → Empty Activity → ชื่อ: SecondActivity
res/layout/activity_second.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".SecondActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_centerInParent="true" />
</RelativeLayout>
SecondActivity.java:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.Arrays;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// รับ Object จาก Intent
Character character = (Character) getIntent().getSerializableExtra("Character");
TextView textView = findViewById(R.id.textView);
textView.setText("ชื่อ: " + character.getName() + "\n" +
"อาชีพ: " + character.getProfession() + "\n" +
"ตำแหน่ง: " + character.getPosition() + "\n" +
"ความสามารถ: " + Arrays.toString(character.getAbilities()));
}
}
ขั้นตอนที่ 6: AndroidManifest.xml (เพิ่ม SecondActivity)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity" />
</application>
</manifest>
การทดสอบ
รันแอป กดปุ่ม "ส่ง Object ไป Second Activity" จะเปิด SecondActivity แสดงข้อมูล Object ที่ส่งมา


วิธีอื่นๆ ในการส่งข้อมูลระหว่าง Activity
| วิธี | เหมาะสำหรับ | ข้อจำกัด |
|---|---|---|
| Serializable (ตัวอย่างนี้) | Object เรียบง่าย, ข้อมูลน้อย | ช้า, ใช้ Reflection, ไม่รองรับการเปลี่ยนแปลงคลาส |
| Parcelable | Object ซับซ้อน, ประสิทธิภาพสูง | โค้ดมาก (ใช้ @Parcelize ใน Kotlin) |
| Bundle (Primitive types) | ข้อมูลพื้นฐาน (String, int, boolean, Array) | ไม่รองรับ Object แบบกำหนดเอง |
| SharedPreferences / Database | ข้อมูลขนาดใหญ่, Persistent | ต้องจัดการ Sync เอง |
| ViewModel (Jetpack) | Share data ระหว่าง Fragment/Activity ใน Graph เดียว | ต้องใช้ Navigation Component |
Parcelable (แนะนำสำหรับ Production)
// Kotlin - ใช้ @Parcelize (สั้นที่สุด)
@Parcelize
data class Character(
val name: String,
val profession: String,
val position: String,
val abilities: Array<String>
) : Parcelable
// Java - implement Parcelable เอง (ยาวกว่า Serializable แต่เร็วกว่า 10x+)
public class Character implements Parcelable {
// ... fields ...
protected Character(Parcel in) {
name = in.readString();
profession = in.readString();
position = in.readString();
abilities = in.createStringArray();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(profession);
dest.writeString(position);
dest.writeStringArray(abilities);
}
public static final Creator<Character> CREATOR = new Creator<Character>() {
@Override public Character createFromParcel(Parcel in) { return new Character(in); }
@Override public Character[] newArray(int size) { return new Character[size]; }
};
@Override public int describeContents() { return 0; }
}
⚠️ ข้อจำกัดของ Intent Extra
- ขนาดสูงสุดประมาณ 1 MB (TransactionTooLargeException)
- ส่ง Bitmap ใหญ่ๆ ผ่าน Intent จะ Crash ได้
- ใช้ SharedPreferences, Database, หรือ File สำหรับข้อมูลขนาดใหญ่