Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách quản lý startActivityForResult trên Android

Giới thiệu

Lưu ý: startActivityForResult() và onActivityResult() đã bị deprecated từ API 30 (Android 11). Thay thế bằng Activity Result APIs (ActivityResultLauncher, ActivityResultContract). Bài viết này giải thích cả hai cách.

Cách cũ (Deprecated - API < 30)

1. Activity chính (MainActivity.java)

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.TextView;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE = 1;
    TextView tvResult;

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

        tvResult = findViewById(R.id.tvResult);
        tvResult.setText("Nhấn để mở Activity con");
        tvResult.setOnClickListener(v -> {
            Intent intent = new Intent(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");
            tvResult.setText("Kết quả: " + result);
        }
    }
}

2. Activity con (SecondActivity.java)

package com.example.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

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

        // Trả kết quả ngay lập tức (ví dụ)
        Intent resultIntent = new Intent();
        resultIntent.putExtra("result", "Dữ liệu từ SecondActivity");
        setResult(Activity.RESULT_OK, resultIntent);
        finish(); // Đóng Activity con
    }
}

3. AndroidManifest.xml

<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>

Cách mới - Activity Result APIs (Khuyến nghị API 30+)

Dependency (build.gradle)

dependencies {
    implementation "androidx.activity:activity:1.7.0"
    implementation "androidx.fragment:fragment:1.5.0"
}

MainActivity hiện đại

package com.example.myapplication;

import android.content.Intent;
import android.os.Bundle;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView tvResult;
    ActivityResultLauncher<Intent> launcher;

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

        tvResult = findViewById(R.id.tvResult);
        tvResult.setText("Nhấn để mở Activity con (Modern API)");

        // Đăng ký launcher
        launcher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                        String data = result.getData().getStringExtra("result");
                        tvResult.setText("Kết quả (Modern): " + data);
                    }
                });

        tvResult.setOnClickListener(v -> {
            Intent intent = new Intent(this, SecondActivity.class);
            launcher.launch(intent);
        });
    }
}

So sánh

Đặc điểmCách cũCách mới (Activity Result API)
Type safetyÉp kiểu thủ côngGeneric type an toàn
Request codeQuản lý int thủ côngTự động, không cần requestCode
Lifecycle awareKhôngCó (tự hủy khi Activity destroyed)
Multiple requestsPhân biệt bằng requestCodeNhiều launcher riêng biệt
TestingKhó testDễ test, mock launcher

Chạy ứng dụng

Nhấn Run. Màn hình chính hiển thị TextView. Nhấn vào → mở SecondActivity → tự động trả về kết quả → TextView cập nhật.

Cách quản lý startActivityForResult trên Android

Cách quản lý startActivityForResult trên Android

Các Contract có sẵn phổ biến

  • TakePicture() - Chụp ảnh
  • PickContact() - Chọn liên hệ
  • GetContent() - Chọn file (ACTION_GET_CONTENT)
  • RequestPermission() - Xin quyền runtime
  • OpenDocumentTree() - Chọn thư mục (Storage Access Framework)