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ố.
- Hiểu rõ hành vi sensorLandscape
Cấu hìnhandroid: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. - Cấu hình configChanges trong Manifest
Thêm thuộc tínhandroid:configChanges="orientation|screenSize|keyboardHidden|fontScale"vào Activity trong AndroidManifest.xml. Ví dụ:
Từ API 13 trở lên, bắt buộc phải bao gồm<activity android:name=".MainScreenActivity" android:screenOrientation="sensorLandscape" android:configChanges="orientation|screenSize|keyboardHidden|fontScale" />screenSizeđể ngăn tái tạo Activity. - Xử lý onConfigurationChanged
Override phương thứconConfigurationChanged()để cập nhật giao diện khi hướng thay đổi:
Tránh gọ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(); } }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. - 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ặconRestoreInstanceState() - Sử dụng
ViewModelđể giữ dữ liệu qua các lần tái tạo
- Lưu dữ liệu trong
- 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-landkhông thiếu tài nguyên)
- Xử lý đúng các View tùy chỉnh trongonDetachedFromWindow()vàonAttachedToWindow()
- Giải phóng tài nguyên của thành phần như CameraPreview trongonPause() - Phân tích log chi tiết
Thu thập log bằng lệnh ADB:
Kiểm tra Native crash vớiadb logcat -c adb logcat > crash_log.txtadb logcat -b crash.