Khắc Phục Lỗi Crash Khi Chuyển Hướng Màn Hình Activity Android

Khi chuyển đổi hướng màn hình, Activity có thể gặp lỗi crash mà không hiển thị thông tin log. Nguyên nhân chính thường liên quan đến việc xử lý thay đổi cấu hình không chính xác hoặc tài nguyên không được tái tạo đúng cách. Dưới đây là hướng dẫn chi tiết để xác định và khắc phục sự cố.
  1. Hiểu rõ hành vi sensorLandscape
    Cấu hình android:screenOrientation="sensorLandscape" chỉ cho phép chế độ ngang (bao gồm cả hướng ngược 180 độ), không chuyển sang dọc. Khi thiết bị xoay giữa các hướng ngang, Activity mặc định sẽ bị hủy và tái tạo nếu không xử lý configChanges, dẫn đến crash nếu trạng thái hoặc tài nguyên không được quản lý đúng.
  2. Cấu hình configChanges trong Manifest
    Thêm thuộc tính android:configChanges="orientation|screenSize|keyboardHidden|fontScale" vào Activity trong AndroidManifest.xml. Ví dụ:
    <activity
        android:name=".MainScreenActivity"
        android:screenOrientation="sensorLandscape"
        android:configChanges="orientation|screenSize|keyboardHidden|fontScale" />
    Từ API 13 trở lên, bắt buộc phải bao gồm screenSize để ngăn tái tạo Activity.
  3. Xử lý onConfigurationChanged
    Override phương thức onConfigurationChanged() để cập nhật giao diện khi hướng thay đổi:
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Display display = getWindowManager().getDefaultDisplay();
        int rotation = display.getRotation();
        if (rotation == Surface.ROTATION_180) {
            adjustForReversedLandscape();
        } else {
            adjustForStandardLandscape();
        }
    }
    Tránh gọi setContentView() trong phương thức này trừ khi cần thiết, vì sẽ thay thế toàn bộ layout và cần bind lại các view.
  4. Quản lý trạng thái Activity
    Nếu không ngăn tái tạo, cần lưu trữ và khôi phục trạng thái:
    • Lưu dữ liệu trong onSaveInstanceState()
    • Khôi phục trong onCreate() hoặc onRestoreInstanceState()
    • Sử dụng ViewModel để giữ dữ liệu qua các lần tái tạo
  5. Kiểm tra tài nguyên và View tùy chỉnh
    - Đảm bảo các file layout không có lỗi khi thay đổi hướng (ví dụ: layout-land không thiếu tài nguyên)
    - Xử lý đúng các View tùy chỉnh trong onDetachedFromWindow()onAttachedToWindow()
    - Giải phóng tài nguyên của thành phần như CameraPreview trong onPause()
  6. Phân tích log chi tiết
    Thu thập log bằng lệnh ADB:
    adb logcat -c
    adb logcat > crash_log.txt
    Kiểm tra Native crash với adb logcat -b crash.
Kiểm tra nhanh: - Đã cấu hình configChanges trong Manifest? - Có override onConfigurationChanged() và cập nhật UI đúng cách? - Đã lưu và khôi phục trạng thái bằng onSaveInstanceState()? - Có sử dụng View tùy chỉnh cần xử lý đặc biệt? - Đã kiểm tra tài nguyên cho từng hướng màn hình?

Thẻ: activity-lifecycle screen-orientation config-changes crash-handling

Đăng vào ngày 1 tháng 6 lúc 10:26