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

Cách vô hiệu hóa nút Back khi đăng xuất ứng dụng Android

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 vô hiệu hóa nút Back khi đăng xuất ứng dụng Android

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.