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

วิธีจัดการ startActivityForResult ใน Android

ภาพรวม

ตัวอย่างนี้แสดงวิธีใช้ startActivityForResult() เพื่อเริ่ม Activity และรับผลลัพธ์กลับมา (Deprecated ใน API 30 แนะนำให้ใช้ Activity Result APIs)

ขั้นตอนการสร้าง (Legacy Way)

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <TextView
        android:id="@+id/actionEvent"
        android:textSize="40sp"
        android:layout_marginTop="30dp"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />
</LinearLayout>

ขั้นตอนที่ 3: Activity หลัก (src/MainActivity.java)

package com.example.myapplication;

import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE = 1;
    TextView actionEvent;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        actionEvent = findViewById(R.id.actionEvent);
        actionEvent.setText("Click to Start SecondActivity");
        
        actionEvent.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivityForResult(intent, REQUEST_CODE);
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {
            String result = data.getStringExtra("result");
            actionEvent.setText("Result: " + result);
        }
    }
}

ขั้นตอนที่ 4: Activity ปลายทาง (src/SecondActivity.java)

package com.example.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        
        // ส่งผลลัพธ์กลับทันที
        Intent returnIntent = new Intent();
        returnIntent.putExtra("result", "Data from SecondActivity");
        setResult(Activity.RESULT_OK, returnIntent);
        finish();
    }
}

ขั้นตอนที่ 5: Layout Activity ที่สอง (res/layout/activity_second.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.myapplication">
    <application ...>
        <activity android:name=".SecondActivity" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

⚠️ Deprecated: ใช้ Activity Result API แทน (API 30+)

ตั้งแต่ Activity 1.2.0+ / Fragment 1.3.0+ ควรใช้ Activity Result APIs แทน

วิธีใหม่: Register Activity Result Launcher

public class MainActivity extends AppCompatActivity {
    TextView actionEvent;
    
    // ลงทะเบียน Launcher (ทำใน onCreate หรือเป็น field)
    private final ActivityResultLauncher<Intent> launcher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                String data = result.getData().getStringExtra("result");
                actionEvent.setText("Result: " + data);
            }
        }
    );

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        actionEvent = findViewById(R.id.actionEvent);
        actionEvent.setText("Click to Start SecondActivity");
        
        actionEvent.setOnClickListener(v -> {
            Intent intent = new Intent(this, SecondActivity.class);
            launcher.launch(intent); // ใช้ launch() แทน startActivityForResult()
        });
    }
}

Contracts พร้อมใช้งานทั่วไป

Contractใช้สำหรับInputOutput
StartActivityForResultเริ่ม Activity ทั่วไปIntentActivityResult
TakePictureถ่ายรูปUriBoolean
PickContactเลือกติดต่อVoidUri
GetContentเลือกไฟล์/รูปString (mimeType)Uri
RequestPermissionขอสิทธิ์เดี่ยวStringBoolean
RequestMultiplePermissionsขอสิทธิ์หลายตัวArray<String>Map<String, Boolean>

ข้อดีของ Activity Result API

  • Type-safe: ไม่ต้องใช้ requestCode
  • Lifecycle-aware: จัดการ Configuration Change เอง
  • แยก Logic ได้ชัดเจน: Register แยกจาก Launch
  • รองรับ Fragment โดยตรง