Giới thiệu
Bài viết minh họa cách xử lý sự kiện nhấn nút Back (phần cứng hoặc gesture) trong Activity bằng cách override onBackPressed() hoặc set OnClickListener cho Button tùy chỉnh.
Các bước thực hiện
Bước 1: Tạo dự án mới
Khởi tạo project Android Studio.
Bước 2: Giao diện (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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context="MainActivity">
<TextView
android:text="Activity của tôi"
android:textSize="30sp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginVertical="25sp"
android:layout_margin="23dp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Back để đóng Activity"
android:id="@+id/button"
android:layout_centerVertical="true"
android:layout_margin="23dp"/>
</RelativeLayout>
Bước 3: Xử lý click Button gọi finish() (src/MainActivity.java)
import android.os.Bundle;
import android.support.v7.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.button);
button.setOnClickListener(v -> finish());
}
}
Bước 4: AndroidManifest.xml
<?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=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Nhấn Button "Back để đóng Activity" → Activity kết thúc (finish) → quay về màn hình trước/home.

Các cách xử lý Back Button
1. Override onBackPressed() (API 20-32, Deprecated API 33+)
@Override
public void onBackPressed() {
// Logic tùy chỉnh trước khi đóng
if (doubleBackToExitPressedOnce) {
super.onBackPressed(); // Gọi đóng thực sự
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Nhấn Back lần nữa để thoát", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(() -> doubleBackToExitPressedOnce = false, 2000);
}
2. OnBackPressedDispatcher (API 33+ / AndroidX - Khuyên dùng)
// Trong onCreate()
OnBackPressedCallback callback = new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
// Logic tùy chỉnh
if (canGoBack()) {
goBack();
} else {
finish(); // Hoặc show confirm dialog
}
}
};
getOnBackPressedDispatcher().addCallback(this, callback);
3. BackHandler trong Compose
BackHandler(enabled = true) {
// Logic khi nhấn back
}
4. Button tùy chỉnh gọi finish() (như ví dụ trên)
button.setOnClickListener(v -> finish()); // Hoặc button.setOnClickListener(v -> onBackPressed()); // Gọi hệ thống xử lý
Khác biệt: finish() vs onBackPressed()
finish(): Kết thúc Activity ngay lập tức, không gọi onBackPressed()onBackPressed(): Xử lý logic back hệ thống (fragment back stack, WebView back, v.v.) rồi mới finish- Nếu có Fragment back stack: onBackPressed() pop fragment trước, finish() sau khi stack rỗng
Best Practices
- Dùng
OnBackPressedDispatcher(AndroidX) thay vì override onBackPressed() - Xử lý confirm dialog thoát app (double back hoặc dialog)
- WebView: override onBackPressed() → webView.goBack() nếu canGoBack()
- Bottom Sheet/Dialog: tự động handle back, không cần code thêm
- Không block back button quá lâu (ANR risk)