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

วิธีสลับ Activity (เปลี่ยนหน้าจอ) ใน Android

ภาพรวม

ตัวอย่างนี้สาธิตการนำทาง (Navigation) ระหว่าง Activity หลายหน้า โดยใช้ Intent และ startActivity()

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

Android Studio → File → New Project

ขั้นตอนที่ 2: Main Activity Layout (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">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp"
        android:text="Main Activity"
        android:textSize="24sp"
        android:textStyle="bold"/>

    <Button
        android:id="@+id/btnOpenAct2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Open Second Activity"/>

</RelativeLayout>

ขั้นตอนที่ 3: MainActivity.java

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

public class MainActivity extends AppCompatActivity {

    Button button;

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

        button = findViewById(R.id.btnOpenAct2);
        button.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
        });
    }
}

ขั้นตอนที่ 4: Second Activity

Layout (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:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp"
        android:text="Second Activity"
        android:textSize="24sp"
        android:textStyle="bold"/>

    <Button
        android:id="@+id/btnOpenMain"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Go back to Main Activity"/>

</RelativeLayout>

SecondActivity.java

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

public class SecondActivity extends AppCompatActivity {

    Button button;

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

        button = findViewById(R.id.btnOpenMain);
        button.setOnClickListener(v -> {
            Intent intent = new Intent(SecondActivity.this, MainActivity.class);
            startActivity(intent);
        });
    }
}

ขั้นตอนที่ 5: Manifest (ลงทะเบียน Activity ทั้งสอง)

<?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=".SecondActivity" android:exported="false"/>
        <activity android:name=".MainActivity" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

การทดสอบ

รันแอป กด "Open Second Activity" → ไปหน้า Second กด "Go back to Main Activity" → กลับหน้า Main

โหมดการเปิด Activity (Launch Modes)

ควบคุมพฤติกรรม Back Stack ด้วย android:launchMode ใน Manifest:

Launch ModeพฤติกรรมUse Case
standard (Default)สร้าง Instance ใหม่ทุกครั้งActivity ทั่วไป
singleTopถ้าอยู่ Top ของ Stack แล้ว ไม่สร้างใหม่ (รับ Intent ใหม่ใน onNewIntent)Search, Notification
singleTaskมี Instance เดียวใน Task ถ้ามีอยู่แล้ว จะ Clear Top และส่ง Intent ใหม่Main Activity, Launcher
singleInstanceเหมือน singleTask แต่อยู่ Task เดี่ยว ไม่มี Activity อื่นใน Task เดียวกันSpecial cases
<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">

Flag ใน Intent (ควบคุม Back Stack แบบ Ad-hoc)

// ล้าง Back Stack เริ่ม Task ใหม่ (เหมือน Login → Home)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

// Clear Top: ถ้า Activity อยู่ใน Stack แล้ว ให้ Clear ทุกอย่างด้านบน
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

// Single Top: ไม่สร้างใหม่ถ้าอยู่ Top
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

// ไม่นับใน Recent Apps
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

ส่งข้อมูลระหว่าง Activity

// ส่ง
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("item_id", 123);
intent.putExtra("item_name", "Product Name");
intent.putExtra("price", 299.99);
startActivity(intent);

// รับ
Intent intent = getIntent();
int id = intent.getIntExtra("item_id", -1);
String name = intent.getStringExtra("item_name");
double price = intent.getDoubleExtra("price", 0.0);

แนวทางปัจจุบัน: Jetpack Navigation Component

สำหรับโปรเจกต์ใหม่ แนะนำใช้ Navigation Component แทน Intent โดยตรง:

  • Visual Navigation Graph (XML)
  • Type-safe Arguments (Safe Args)
  • Deep Link รองรับอัตโนมัติ
  • Back Stack จัดการให้อัตโนมัติ
  • รองรับ Fragment, Activity, Dialog
// nav_graph.xml
<navigation ...>
    <fragment android:id="@+id/mainFragment" ...>
        <action android:id="@+id/action_main_to_detail"
            app:destination="@+id/detailFragment"/>
    </fragment>
    <fragment android:id="@+id/detailFragment" ...>
        <argument android:name="itemId" app:argType="integer"/>
    </fragment>
</navigation>

// ใน Fragment
findNavController().navigate(R.id.action_main_to_detail, bundleOf("itemId" to 123))

สรุป

  • พื้นฐาน: Intent + startActivity()
  • ควบคุม Stack: launchMode ใน Manifest หรือ Intent Flags
  • ส่งข้อมูล: putExtra() / getIntent().getXxxExtra()
  • โปรเจกต์ใหม่: ใช้ Navigation Component + Fragment แทน Activity หลายหน้า