บทความนี้ครอบคลุม 2 วิธีหลักในการส่งข้อมูลระหว่าง Activity โดยไม่ทำให้ข้อมูลคงอยู่ (Non-persistent) คือ Static Methods และ Intents
วิธีที่ 1: ใช้ Static Methods (ตัวแปร Static)
วิธีนี้เก็บข้อมูลไว้ในตัวแปร static ของคลาส Activity ต้นทาง แล้วให้ Activity ปลายทางเข้าถึงผ่านเมธอด static
ขั้นตอนการทำงาน
- สร้างโปรเจกต์ใหม่ใน Android Studio
- สร้าง Layout พร้อม EditText และ Button (เหมือนตัวอย่างก่อนหน้า)
- ใน MainActivity.java ประกาศตัวแปร
private static String value;และเมธอดpublic static String getValue() - เมื่อกดปุ่ม ให้กำหนดค่า
valueแล้ว startActivity(Intent) - ใน SecondActivity เรียก
MainActivity.getValue()เพื่อแสดงผล
โค้ดสำคัญ MainActivity.java
public class MainActivity extends AppCompatActivity {
private static String value;
public static String getValue() {
return value;
}
// ... ใน onClick:
value = editText.getText().toString().trim();
startActivity(new Intent(this, SecondActivity.class));
}
โค้ดสำคัญ SecondActivity.java
textView.setText(MainActivity.getValue());
⚠️ ข้อจำกัดของ Static Methods
- ข้อมูลจะหายเมื่อ Process ถูกฆ่าโดยระบบ (Low Memory)
- อาจก่อให้เกิด Memory Leak หากเก็บ Context/View
- ไม่เหมาะกับข้อมูลขนาดใหญ่หรือสำคัญ
- ยากต่อการทดสอบ (Unit Testing)
วิธีที่ 2: ใช้ Intents (มาตรฐานและแนะนำ)
วิธีนี้ส่งข้อมูลผ่าน Intent โดยใช้ putExtra() หรือ Bundle ซึ่งเป็นวิธีที่ Android ออกแบบมาให้ใช้งาน
ขั้นตอนการทำงาน
- สร้างโปรเจกต์ใหม่ (หรือใช้โปรเจกต์เดิม)
- Layout เหมือนเดิม
- ใน MainActivity ใช้
intent.putExtra("key", value) - ใน SecondActivity ใช้
getIntent().getStringExtra("key")
โค้ดสำคัญ MainActivity.java
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("value", editText.getText().toString().trim());
startActivity(intent);
โค้ดสำคัญ SecondActivity.java
String value = getIntent().getStringExtra("value");
if (value != null) {
textView.setText(value);
}
สรุป: ควรใช้วิธีไหน?
| สถานการณ์ | วิธีที่แนะนำ | เหตุผล |
|---|---|---|
| ข้อมูลพื้นฐาน (String, int, boolean) | Intent.putExtra() | เขียนง่าย อ่านง่าย มาตรฐาน |
| ข้อมูลหลายชนิด/หลายรายการ | Bundle + Intent | จัดกลุ่มได้ รองรับ Parcelable/Serializable |
| Object ปรับแต่งเอง (Custom Object) | Intent.putExtra() + Parcelable | ประสิทธิภาพดีกว่า Serializable มาก |
| ข้อมูลชั่วคราว ระหว่าง Activity เดียวกัน | ViewModel (Jetpack) | รองรับ Lifecycle ป้องกัน Memory Leak |
| Static Methods | ไม่แนะนำ |
AndroidManifest.xml (เหมือนกันทั้ง 2 วิธี)
<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"></activity>
การทดสอบ
รันแอป ทดสอบทั้ง 2 วิธี จะพบว่า Intent ให้ผลลัพธ์ที่น่าเชื่อถือและปลอดภัยกว่า