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

วิธีส่ง Object จาก Activity หนึ่งไปอีก Activity ใน Android

การส่งอ็อบเจกต์ (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 ที่ส่งมา

วิธีส่ง Object จาก Activity หนึ่งไปอีก Activity ใน Android

วิธีส่ง Object จาก Activity หนึ่งไปอีก Activity ใน Android

วิธีอื่นๆ ในการส่งข้อมูลระหว่าง 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 สำหรับข้อมูลขนาดใหญ่