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

วิธีส่งข้อมูลระหว่าง Activity ด้วย Serializable ใน Android


การทำความเข้าใจ Serialization ใน Android

Serialization เป็นกระบวนการแปลงสถานะของออบเจ็กต์ให้กลายเป็น Byte Stream ซึ่งเป็นข้อมูลที่ไม่ขึ้นกับแพลตฟอร์ม ทำให้สามารถส่งผ่าน Intent ระหว่าง Activity ได้ ใน Java เราจะใช้ interface java.io.Serializable ซึ่งเป็น Marker Interface (ไม่มีเมธอด) เพื่อบอกให้ JVM รู้ว่าคลาสนี้สามารถทำ Serialization ได้

ตัวอย่างการส่งออบเจ็กต์ระหว่าง 2 Activity

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

เปิด Android Studio → File → New Project → กรอกข้อมูลที่จำเป็น → Finish

ขั้นตอนที่ 2: ออกแบบ Layout (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="ป้อนชื่อ"
            android:inputType="text" />

        <EditText
            android:id="@+id/phone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="ป้อนเบอร์โทรศัพท์"
            android:inputType="number"/>

        <Button
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ส่งข้อมูล" />

    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

ขั้นตอนที่ 3: สร้างคลาส Model (Userinfo.java)

คลาสนี้ต้อง implements Serializable เพื่อให้สามารถส่งผ่าน Bundle ได้

import java.io.Serializable;

public class Userinfo implements Serializable {
    private String name;
    private 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; }
}

ขั้นตอนที่ 4: MainActivity.java - ส่งข้อมูล

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private EditText nameEditText, phoneEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nameEditText = findViewById(R.id.name);
        phoneEditText = findViewById(R.id.phone);
        Button sendBtn = findViewById(R.id.send);

        sendBtn.setOnClickListener(v -> {
            String name = nameEditText.getText().toString().trim();
            String phone = phoneEditText.getText().toString().trim();

            if (TextUtils.isEmpty(name) && TextUtils.isEmpty(phone)) {
                Toast.makeText(this, "กรุณากรอกข้อมูลให้ครบถ้วน", Toast.LENGTH_LONG).show();
            } else {
                sendUserData(name, phone);
            }
        });
    }

    private void sendUserData(String username, String userPhone) {
        Userinfo userinfo = new Userinfo();
        userinfo.setName(username);
        userinfo.setPhone(userPhone);

        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        Bundle bundle = new Bundle();
        bundle.putSerializable("user_data", userinfo); // key ต้องตรงกัน
        intent.putExtras(bundle);
        startActivity(intent);
    }
}

ขั้นตอนที่ 5: SecondActivity.java - รับข้อมูล

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {
    private TextView dataTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        dataTextView = findViewById(R.id.data);

        // รับข้อมูลจาก Intent
        Userinfo userinfo = (Userinfo) getIntent().getSerializableExtra("user_data");
        
        if (userinfo != null) {
            String name = userinfo.getName();
            String phone = userinfo.getPhone();
            dataTextView.setText("ชื่อ: " + name + "\nเบอร์โทร: " + phone);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        // ล้าง reference เพื่อป้องกัน memory leak
        dataTextView = null;
    }
}

ขั้นตอนที่ 6: Layout ของ SecondActivity (activity_second.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp" />

</LinearLayout>

หมายเหตุสำคัญ

  • Key ต้องตรงกัน: key ที่ใช้ใน putSerializable() และ getSerializableExtra() ต้องเหมือนกันทุกประการ
  • Performance: Serializable ใช้ Reflection ทำงานช้ากว่า Parcelable เหมาะสำหรับข้อมูลเล็กน้อย
  • serialVersionUID: ควรเพิ่ม private static final long serialVersionUID = 1L; ในคลาส Model เพื่อความปลอดภัยเวลาเวอร์ชันเปลี่ยน
  • Android 12+: ต้องระบุ android:exported ใน Manifest สำหรับ Activity ที่รับ Intent

การทดสอบ

รันแอปบนอุปกรณ์จริงหรือ Emulator → กรอกชื่อและเบอร์โทร → กดปุ่ม "ส่งข้อมูล" → จะไปหน้า SecondActivity และแสดงข้อมูลที่ส่งมา