Để Activity con trả về kết quả cho Activity cha, Android cung cấp cơ chế startActivityForResult() kết hợp onActivityResult(). Lưu ý: Từ API 30 (Android 11), API này bị deprecated, thay thế bằng Activity Result APIs (registerForActivityResult). Bài viết dưới đây minh họa cách truyền thống vẫn phổ biến trong nhiều dự án hiện tại.
Các bước thực hiện
Bước 1: Tạo dự án mới
Tạo dự án với package com.example.myapplication.
Bước 2: Giao diện Activity chính (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"
android:layout_margin="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:text="Chưa có dữ liệu"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginTop="16dp"
android:text="Lấy dữ liệu" />
</RelativeLayout>
Bước 3: Activity chính gửi request (src/MainActivity.java)
package com.example.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static final int MY_REQUEST_CODE = 1;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text_view);
Button button = findViewById(R.id.button);
button.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, MY_REQUEST_CODE);
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == MY_REQUEST_CODE) {
if (data != null) {
String value = data.getStringExtra("value");
textView.setText(value);
}
}
}
}
Bước 4: Giao diện Activity con (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"
android:layout_margin="16dp"
tools:context=".SecondActivity">
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:hint="Nhập nội dung trả về Activity trước"
android:inputType="text" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginTop="16dp"
android:text="Xong" />
</RelativeLayout>
Bước 5: Activity con trả kết quả (src/SecondActivity.java)
package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
EditText editText = findViewById(R.id.edit_text);
Button button = findViewById(R.id.button);
button.setOnClickListener(v -> {
String value = editText.getText().toString().trim();
Intent intent = new Intent();
intent.putExtra("value", value);
setResult(RESULT_OK, intent);
finish(); // Quan trọng: phải gọi finish() để trở về Activity cha
});
}
}
Bước 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
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>
Cách hiện đại (API 30+): Activity Result APIs
Thay vì startActivityForResult và onActivityResult, hãy dùng:
// Trong MainActivity
private ActivityResultLauncher<Intent> launcher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == RESULT_OK && result.getData() != null) {
String value = result.getData().getStringExtra("value");
textView.setText(value);
}
}
);
// Khi muốn mở SecondActivity:
launcher.launch(new Intent(MainActivity.this, SecondActivity.class));
Cách này an toàn hơn, tránh xung đột request code và tự động quản lý vòng đời.