Giới thiệu
Ví dụ này minh họa cách ghi đè phương thức onBackPressed() để ngăn chặn hành động mặc định của nút Back (quay lại Activity trước / thoát app), thường dùng khi người dùng đã đăng xuất không cho phép quay lại màn hình đã đăng nhập.
Các bước thực hiện
Bước 1: Tạo dự án mới
Android Studio → File → New Project → Empty Activity.
Bước 2: Giao diện (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:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Màn hình sau đăng xuất" />
</LinearLayout>
Bước 3: Code MainActivity (src/MainActivity.java)
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onBackPressed() {
// Không gọi super.onBackPressed() -> không quay lại activity trước
Toast.makeText(getApplicationContext(), "Nút Back đã bị vô hiệu hóa", Toast.LENGTH_SHORT).show();
}
}
Bước 4: Manifest (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>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Nhấn nút Back vật lý/hệ thống → Toast hiện "Nút Back đã bị vô hiệu hóa", app không thoát.

Cách tiếp cận hiện đại & Best Practices (API 28+)
1. OnBackPressedDispatcher (Khuyến nghị từ Android 10 / API 28)
Thay vì override onBackPressed(), hãy đăng ký callback:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
OnBackPressedCallback callback = new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
Toast.makeText(MainActivity.this, "Back disabled", Toast.LENGTH_SHORT).show();
}
};
getOnBackPressedDispatcher().addCallback(this, callback);
// Khi muốn bật lại back:
// callback.setEnabled(false);
}
- Lifecycle-aware: Tự hủy khi Activity destroy.
- Dễ dàng bật/tắt điều kiện (ví dụ: chỉ disable khi ở màn hình đăng nhập).
- Hoạt động nhất quán với gesture navigation (vuốt từ cạnh màn hình).
2. Xử lý đăng xuất thực tế (Navigation)
Thay vì disable back, hãy xóa back stack khi đăng xuất:
// Trong LoginActivity sau khi login thành công
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
Hoặc dùng Navigation Component:
navController.navigate(R.id.action_login_to_main);
navController.popBackStack(R.id.login_graph, true); // xóa back stack login
Khi nào nên disable Back?
- Màn hình khóa ứng dụng (App Lock / PIN).
- Quy trình onboarding/bắt buộc (không cho bỏ qua).
- Game chơi fullscreen (tránh thoát vô tình).
Tránh lạm dụng - vi phạm UX chuẩn Android, gây bực bội người dùng.