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ểm | Cách cũ | Cách mới (Activity Result API) |
|---|---|---|
| Type safety | Ép kiểu thủ công | Generic type an toàn |
| Request code | Quản lý int thủ công | Tự động, không cần requestCode |
| Lifecycle aware | Không | Có (tự hủy khi Activity destroyed) |
| Multiple requests | Phân biệt bằng requestCode | Nhiều launcher riêng biệt |
| Testing | Khó test | Dễ 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ác Contract có sẵn phổ biến
TakePicture()- Chụp ảnhPickContact()- Chọn liên hệGetContent()- Chọn file (ACTION_GET_CONTENT)RequestPermission()- Xin quyền runtimeOpenDocumentTree()- Chọn thư mục (Storage Access Framework)