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

การส่งข้อมูลระหว่าง Activity ใน Android: Static Methods

บทความนี้เน้นสาธิตวิธีการส่งข้อมูลระหว่าง Activity โดยใช้ Static Methods เท่านั้น ซึ่งเป็นวิธีที่ง่ายแต่มีข้อจำกัดสำคัญ

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

Android Studio → File → New Project → กรอกรายละเอียดครบถ้วน

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

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="16dp"
    android:orientation="vertical">

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="ป้อนข้อความ"
        android:inputType="text" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="16dp"
        android:text="ส่งข้อมูล" />
</LinearLayout>

ขั้นตอนที่ 3: MainActivity.java (Static Variable)

package com.example.myapplication;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    // ตัวแปร static เก็บข้อมูล
    private static String sharedValue;

    // Getter แบบ static
    public static String getSharedValue() {
        return sharedValue;
    }

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

        final EditText editText = findViewById(R.id.edit_text);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // เก็บข้อมูลในตัวแปร static
                sharedValue = editText.getText().toString().trim();
                
                // เริ่ม Activity ใหม่ (ยังต้องใช้ Intent เพื่อนำทาง)
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });
    }
}

ขั้นตอนที่ 4: Layout Activity ที่สอง (activity_second.xml)

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="16dp"
    android:orientation="vertical"
    android:gravity="center">

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

ขั้นตอนที่ 5: SecondActivity.java (อ่านค่า Static)

package com.example.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

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

        TextView textView = findViewById(R.id.text_view);
        
        // เรียกค่าจาก Static Method ของ MainActivity
        String value = MainActivity.getSharedValue();
        textView.setText(value != null ? value : "ไม่มีข้อมูล");
    }
}

ขั้นตอนที่ 6: AndroidManifest.xml

<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.myapplication">
    <application ...>
        <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>

⚠️ ข้อควรระวังสำคัญ

🚫 ทำไมไม่ควรใช้ Static Methods สำหรับส่งข้อมูล?

  • Memory Leak: ถ้าเก็บ Context, View, หรือ Object ใหญ่ จะป้องกัน Garbage Collector ไม่ได้ทำงาน
  • ข้อมูลหายง่าย: เมื่อ Android กำจัด Process เพื่อหน่วยความจำ ค่า Static จะถูกล้างเป็น null
  • ยากต่อการทดสอบ: Static State ทำให้ Unit Test ยาก เพราะสถานะคงอยู่ระหว่าง Test Case
  • ไม่รองรับ Multi-process: หากแอปมีหลาย Process ค่า Static จะไม่ shared ระหว่างกัน
  • Thread Safety: ไม่มีการควบคุมการเข้าถึงพร้อมกัน (Concurrency)

✅ แนวทางที่ดีกว่า (Best Practices)

  1. Intent + Bundle/putExtra - มาตรฐาน สำหรับข้อมูลเล็ก-กลาง
  2. ViewModel (Jetpack) - แชร์ข้อมูลระหว่าง Fragment/Activity ในกราฟเดียว รองรับ Lifecycle
  3. SharedPreferences / DataStore - ข้อมูลที่ต้องคงอยู่ (Persistent)
  4. Room Database - ข้อมูลโครงสร้างซับซ้อน ต้องการ Query
  5. Application Class / Singleton Repository - ข้อมูลระดับแอปพลิเคชัน (ระวัง Memory Leak)

การทดสอบ

รันแอป ป้อนข้อความ กด "ส่งข้อมูล" จะเห็นข้อความแสดงใน Activity ที่สอง แต่ลองกด Home แล้วกลับมา อาจพบข้อมูลหายไปหาก Process ถูกฆ่า

สรุป: Static Methods ใช้ได้เฉพาะกรณีทดสอบเร็วหรือข้อมูลเล็กน้อยที่ไม่สำคัญ ห้ามใช้ใน Production App