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

Cách xử lý nút Back trong Activity Android?

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ách xử lý nút Back trong Activity Android?

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)