Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีส่งค่าระหว่าง Activity ใน Android: Static Methods และ Intents

บทความนี้ครอบคลุม 2 วิธีหลักในการส่งข้อมูลระหว่าง Activity โดยไม่ทำให้ข้อมูลคงอยู่ (Non-persistent) คือ Static Methods และ Intents

วิธีที่ 1: ใช้ Static Methods (ตัวแปร Static)

วิธีนี้เก็บข้อมูลไว้ในตัวแปร static ของคลาส Activity ต้นทาง แล้วให้ Activity ปลายทางเข้าถึงผ่านเมธอด static

ขั้นตอนการทำงาน

  1. สร้างโปรเจกต์ใหม่ใน Android Studio
  2. สร้าง Layout พร้อม EditText และ Button (เหมือนตัวอย่างก่อนหน้า)
  3. ใน MainActivity.java ประกาศตัวแปร private static String value; และเมธอด public static String getValue()
  4. เมื่อกดปุ่ม ให้กำหนดค่า value แล้ว startActivity(Intent)
  5. ใน 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 ออกแบบมาให้ใช้งาน

ขั้นตอนการทำงาน

  1. สร้างโปรเจกต์ใหม่ (หรือใช้โปรเจกต์เดิม)
  2. Layout เหมือนเดิม
  3. ใน MainActivity ใช้ intent.putExtra("key", value)
  4. ใน 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);
}

สรุป: ควรใช้วิธีไหน?

  • มีความเสี่ยงสูง ไม่ใช่ Best Practice
  • สถานการณ์ วิธีที่แนะนำ เหตุผล
    ข้อมูลพื้นฐาน (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 ให้ผลลัพธ์ที่น่าเชื่อถือและปลอดภัยกว่า