Android kích hoạt chế độ tương thích cho những ứng dụng khai báo hướng hoặc các quy tắc hạn chế về khả năng đổi kích thước. Chế độ tương thích đảm bảo hành vi được chấp nhận của ứng dụng trên thiết bị màn hình lớn và điện thoại màn hình gập có thể gập lại nhưng khả năng hữu dụng chưa tối ưu.
Chế độ ghi đè cho mỗi ứng dụng cho phép nhà sản xuất thiết bị thay đổi hành vi của ứng dụng để cải thiện trải nghiệm người dùng hoặc ngăn ứng dụng gặp lỗi các thiết bị cụ thể.
Thiết bị tham chiếu
Các thiết bị sau có thể yêu cầu chế độ ghi đè cho mỗi ứng dụng do tính năng cấu hình hoặc cấu hình không được ứng dụng hỗ trợ tốt:
- Máy tính bảng: Hướng tự nhiên của một số máy tính bảng, chẳng hạn như Pixel Tablet,
là hướng ngang. Một thiết bị ở hướng tự nhiên khi
Display#getRotation()
trả lại hàngSurface.ROTATION_0
. Nếu ứng dụng giả địnhROTATION_0
là hướng dọc, bố cục ứng dụng và bản xem trước của máy ảnh có thể không khớp với màn hình thiết bị. - Thiết bị có thể gập lại theo chiều ngang: Một số thiết bị có thể gập lại (chẳng hạn như Pixel Fold) đang ở giai đoạn hướng dọc khi gập lại, nhưng hướng ngang khi mở ra. Nếu ứng dụng giả định hướng khi mở là hướng dọc, nhấp nháy lặp lại hoặc các vấn đề về bố cục.
- Điện thoại gập có thể gập lại: Điện thoại gập khi mở thường ở chế độ dọc hướng. Tuy nhiên, khi gập lại, điện thoại thường có một màn hình nhỏ ở theo hướng ngang. Ứng dụng phải xác định và điều chỉnh cho phù hợp hướng của màn hình.
Các vấn đề thường gặp về khả năng tương thích
Các ứng dụng thường gặp vấn đề về khả năng tương thích do hướng ứng dụng các quy tắc hạn chế, quy tắc hạn chế về khả năng đổi kích thước và tỷ lệ khung hình, cách xử lý không chính xác hướng bản xem trước của máy ảnh và các API bị sử dụng sai mục đích.
Hiệu ứng hòm thư
Hiệu ứng hòm thư đặt ứng dụng ở chính giữa màn hình hoặc trên màn hình lớn, sang một bên hoặc bên kia để thuận tiện truy cập. Hiệu ứng mờ (thanh có màu đồng nhất hoặc hình nền bị mờ) lấp đầy khu vực hiển thị chưa sử dụng dọc theo các cạnh hoặc trên cùng và cuối ứng dụng.
Hiệu ứng hòm thư thường diễn ra trên các thiết bị có màn hình lớn do kích thước và tỷ lệ khung hình của màn hình thiết bị thường khác với tỷ lệ khung hình của màn hình chuẩn mà hầu hết các ứng dụng đều được thiết kế.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/letterboxing.png?authuser=9&hl=vi)
Hình 1. Ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc được tạo hiệu ứng hòm thư trên máy tính bảng xoay ngang và có thể gập lại.
Vấn đề
Ứng dụng chỉ hỗ trợ một số cấu hình màn hình vì ứng dụng đã khắc phục một số lỗi hướng, tỷ lệ khung hình cố định hoặc không thể đổi kích thước.
Các chế độ cài đặt cấu hình kiểm soát khả năng đổi kích thước và hướng ứng dụng bao gồm sau:
screenOrientation
: Chỉ định một hướng cố định cho ứng dụng. Các ứng dụng cũng có thể đặt hướng trong thời gian chạy bằng cách sử dụngActivity#setRequestedOrientation()
.resizeableActivity
: Cho biết liệu hệ thống có thể đổi kích thước ứng dụng cho vừa với các cửa sổ có kích thước khác nhau. Trên Android 11 (cấp độ API) 30) trở xuống, chỉ định xem ứng dụng có hỗ trợ chế độ nhiều cửa sổ hay không. Đang bật Android 12 (API cấp 31) trở lên, chỉ định xem ứng dụng có hỗ trợ hay không chế độ nhiều cửa sổ trên màn hình nhỏ (nhỏ gọn lớp kích thước cửa sổ). Trên Android 12 trở lên, ứng dụng hỗ trợ chế độ nhiều cửa sổ trên màn hình lớn (cửa sổ trung bình hoặc mở rộng lớp kích thước) bất kể chế độ cài đặt này là gì.maxAspectRatio
: Chỉ định tỷ lệ khung hình tối đa được ứng dụng hỗ trợ. Chỉ những ứng dụng córesizeableActivity
được đặt thànhfalse
mới có thể đặtmaxAspectRatio
.minAspectRatio
: Chỉ định tỷ lệ khung hình tối thiểu được ứng dụng hỗ trợ. Chỉ những ứng dụng córesizeableActivity
được đặt thànhfalse
mới có thể đặtminAspectRatio
.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/letterboxing_issue.png?authuser=9&hl=vi)
Ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc không dùng được trên thiết bị xoay ngang.
Tối ưu hoá
Ứng dụng phải hỗ trợ tất cả thiết bị và màn hình có chế độ nhiều cửa sổ hướng và kích thước. Xoá tất cả hướng và tỷ lệ khung hình cố định hạn chế từ bố cục ứng dụng và tệp kê khai ứng dụng của bạn.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/letterboxing_optimization.png?authuser=9&hl=vi)
Ứng dụng hỗ trợ mọi hướng thiết bị.
Giải pháp về khả năng tương thích
Nếu một ứng dụng có hướng hoặc tỷ lệ khung hình cố định chạy trong một cửa sổ mà ứng dụng không trực tiếp hỗ trợ kích thước hoặc hướng cửa sổ, Android tạo hiệu ứng hòm thư để duy trì tính liên tục.
Kể từ Android 12 (API cấp 31) và tiếp tục với 12L (API cấp 32), nền tảng này áp dụng nhiều tính năng nâng cao cho các ứng dụng dạng hòm thư. Thiết bị nhà sản xuất triển khai các giao diện người dùng nâng cao. Bạn không cần làm gì thêm cho ứng dụng của bạn để hưởng lợi từ những cải tiến.
Android 12 (API cấp 31) ra mắt các tính năng nâng cao mang tính thẩm mỹ sau đây, có thể được định cấu hình bởi nhà sản xuất thiết bị:
- Góc bo tròn: Các góc của cửa sổ ứng dụng có giao diện tinh tế hơn.
- Độ trong suốt của thanh hệ thống: Các thanh trạng thái và thanh điều hướng phủ lên có dạng bán trong suốt, làm cho các biểu tượng trên thanh luôn có thể xem được trên nền hòm thư.
- Tỷ lệ khung hình có thể định cấu hình: Bạn có thể điều chỉnh tỷ lệ khung hình của ứng dụng để cải thiện giao diện của ứng dụng.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/enhanced_letterboxing.png?authuser=9&hl=vi)
Hình 2. Ứng dụng dạng hòm thư có các tính năng nâng cao cho giao diện người dùng.
12L (API cấp 32) bổ sung một số điểm cải tiến về chức năng như sau:
Vị trí có thể định cấu hình: Trên màn hình lớn, nhà sản xuất thiết bị có thể đặt ứng dụng ở bên trái hoặc bên phải màn hình, làm cho tương tác dễ dàng hơn.
Nút khởi động lại được thiết kế lại: Nhà sản xuất thiết bị có thể khởi động lại nút cho chế độ tương thích với kích thước một giao diện mới để người dùng dễ nhận ra hơn.
Android 13 (API cấp 33) bổ sung một hộp thoại hướng dẫn người dùng về cách định vị ứng dụng dạng hòm thư trên màn hình hoặc thêm hòm thư ở chế độ chia đôi màn hình:
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/enhanced_letterboxing_user_dialog.png?authuser=9&hl=vi)
Hình 3. Ứng dụng dạng hòm thư có hộp thoại hướng dẫn người dùng.
Chế độ tương thích với kích thước
Chế độ tương thích với kích thước là hiệu ứng hòm thư có chứa nút điều khiển khởi động lại. Chiến lược phát hành đĩa đơn cho phép người dùng khởi động lại ứng dụng và vẽ lại màn hình. Lệnh gọi trên Android chế độ tương thích với kích thước cho các ứng dụng được xác định là không thể đổi kích thước. Khi một hoạt động sẽ di chuyển sang một vùng chứa hiển thị không tương thích với thì hệ thống có thể điều chỉnh kích thước của ứng dụng để lấp đầy màn hình thiết bị vào ít nhất một phương diện.
Thay đổi về cấu hình thiết bị có thể kích hoạt chế độ tương thích với kích thước như sau:
- Xoay thiết bị
- Gấp hoặc mở thiết bị có thể gập lại
- Thay đổi giữa chế độ hiển thị toàn màn hình và chế độ chia đôi màn hình
Vấn đề
Chế độ tương thích với kích thước thường áp dụng cho các hoạt động bị hạn chế trong và được định cấu hình (hoặc do hệ thống xác định) thành không thể đổi kích thước.
Ứng dụng của bạn được xem là có thể đổi kích thước và sẽ không được đặt về kích thước chế độ tương thích—nếu đáp ứng bất kỳ tiêu chí nào sau đây:
- Có thể đổi kích thước bằng
resizeableActivity="true"
- Hỗ trợ chế độ hình trong hình (PIP)
- Được nhúng
- Có áp dụng chế độ ghi đè cho mỗi ứng dụng
FORCE_RESIZE_APP
theo nhà sản xuất thiết bị (các thuộc tính do ứng dụng đặt sẽ bị bỏ qua)
Nếu không đáp ứng điều kiện nào, thì ứng dụng của bạn được coi là chưa có thể đổi kích thước và có thể được đặt ở chế độ tương thích với kích thước.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/size_compatibility_mode_issue.gif?authuser=9&hl=vi)
Ứng dụng không thể đổi kích thước gặp sự cố ở chế độ nhiều cửa sổ.
Tối ưu hoá
Ứng dụng phải hỗ trợ mọi kích thước màn hình. Làm cho ứng dụng có thể đổi kích thước bằng cách đặt giá trị
Thuộc tính android:resizeableActivity
của <activity>
hoặc phần tử <application>
vào true
trong
tệp kê khai ứng dụng. Thiết kế bố cục thích ứng cho ứng dụng của bạn. Để biết thêm
thông tin, xem
Hỗ trợ nhiều kích thước màn hình và Hỗ trợ
chế độ nhiều cửa sổ.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/size_compatibility_mode_optimization.gif?authuser=9&hl=vi)
Ứng dụng hoạt động ở mọi kích thước cửa sổ.
Giải pháp về khả năng tương thích
Android đặt một ứng dụng vào chế độ tương thích với kích thước khi hệ thống xác định Bạn có thể cải thiện màn hình của ứng dụng dạng hòm thư bằng cách điều chỉnh kích thước ứng dụng để lấp đầy cửa sổ hiển thị ở ít nhất một chiều. Hệ thống sẽ hiển thị nút điều khiển khởi động lại giúp tạo lại quy trình của ứng dụng, hoạt động và vẽ lại màn hình. Xem thêm bài viết Tổng quan về quy trình và luồng.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/size_compatibility_mode_workaround.gif?authuser=9&hl=vi)
Ứng dụng chỉ hiển thị theo hướng dọc, có dạng hòm thư theo hướng ngang, được điều chỉnh kích thước bằng nút điều khiển khởi động lại.
Vòng lặp nhấp nháy
Khi một ứng dụng không hỗ trợ tất cả các hướng hiển thị, ứng dụng đó có thể lặp lại nhiều lần yêu cầu hướng mới khi cấu hình thay đổi, tạo ra một vòng lặp vô hạn khiến màn hình nhấp nháy hoặc ứng dụng xoay liên tục.
Vấn đề
Trên Android 12 (API cấp 31) trở lên, nhà sản xuất thiết bị có thể định cấu hình
thiết bị của họ để bỏ qua các hạn chế về hướng do ứng dụng chỉ định và thay vào đó
thực thi chế độ tương thích. Ví dụ: thiết bị có thể gập lại có thể bỏ qua
android:screenOrientation="portrait"
của hoạt động
cài đặt khi hoạt động được hiển thị trên kích thước máy tính bảng ngang của thiết bị,
màn hình trong.
Nếu các quy tắc hạn chế về hướng của một ứng dụng bị bỏ qua, thì ứng dụng đó có thể được lập trình
bằng cách gọi
Activity#setRequestedOrientation()
. Cuộc gọi
kích hoạt quá trình khởi động lại ứng dụng nếu ứng dụng hiện không xử lý các thay đổi về cấu hình (xem
Xử lý thay đổi về cấu hình). Sau
khởi động lại, các quy tắc hạn chế về hướng của ứng dụng lại bị bỏ qua, ứng dụng sẽ lặp lại
lệnh gọi đến setRequestedOrientation()
, lệnh gọi này sẽ kích hoạt quá trình khởi động lại ứng dụng và
cứ tiếp tục như vậy trong một vòng lặp tự duy trì.
Một cách khác để bạn có thể gặp phải vấn đề này là khi
hướng tự nhiên (hướng thông thường như
do Android xác định) của màn hình thiết bị ở chế độ ngang (tức là gọi
Trả lại hàng Display#getRotation()
Surface.ROTATION_0
khi thiết bị hiển thị theo hướng ngang
). Trước đây, các ứng dụng giả định rằng Display.getRotation() =
Surface.ROTATION_0
có nghĩa là thiết bị ở hướng dọc, nhưng điều này không phải như vậy
luôn luôn là đúng, ví dụ như trên màn hình trong của một số thiết bị có thể gập lại và
trên một số máy tính bảng.
Một ứng dụng ở hướng ngang trên màn hình bên trong có thể gập lại, có thể kiểm tra
xoay màn hình, nhận giá trị ROTATION_0
, giả định hướng tự nhiên
của thiết bị ở chế độ dọc và cuộc gọi
setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
để định cấu hình lại bố cục ứng dụng. Sau khi ứng dụng khởi động lại (ở chế độ ngang
hướng), nó có thể kiểm tra lại chế độ xoay màn hình, nhận giá trị
ROTATION_0
, gọi
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
và
tiếp tục vòng lặp vô hạn.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/flickering_loops_issue.gif?authuser=9&hl=vi)
Ứng dụng chỉ hiển thị theo hướng ngang trên màn hình dọc thực hiện các lệnh gọi lặp lại đến Activity#setRequestedOrientation()
.
Tối ưu hoá
Ứng dụng không nên làm những việc sau:
- Đặt hướng mặc định bằng
Activity#setRequestedOrientation()
trong phần hoạt độngonCreate()
vì yêu cầu về hướng có thể là được kích hoạt bất ngờ bởi các thay đổi về cấu hình chưa được xử lý - Giả sử hướng tự nhiên (
ROTATION_0
) của thiết bị là hướng dọc - Đặt hướng dựa trên các tín hiệu không liên quan đến kích thước cửa sổ hiện tại, chẳng hạn như
với tên
Display#getRotation()
, nghĩa là sự hiện diện củaFoldingFeature
hoặc API không dùng nữa.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/flickering_loops_optimization.gif?authuser=9&hl=vi)
Ứng dụng xử lý thay đổi về cấu hình, không có quy tắc hạn chế về hướng nên không chuyển sang vòng lặp nhấp nháy.
Giải pháp về khả năng tương thích
Android bỏ qua các lệnh gọi đến Activity#setRequestedOrientation()
trong các lệnh sau
trường hợp:
Hoạt động đã chạy lại từ một lệnh gọi phương thức trước đó hoặc đã bật chế độ buộc xoay tương thích với máy ảnh (xem bài viết Máy ảnh bản xem trước bên dưới).
Nhà sản xuất thiết bị có thể áp dụng hành vi này cho một ứng dụng có
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
.Hoạt động này đã thực hiện hơn 2 yêu cầu liên quan đến hướng trong một giây, điều này cho biết đã xảy ra một vòng lặp. Trong hai yêu cầu trong vòng lặp này, Android sử dụng quảng cáo giúp tối đa hoá khu vực hiển thị ứng dụng.
Nhà sản xuất thiết bị có thể áp dụng hành vi này cho một ứng dụng có
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
.
Bản xem trước của máy ảnh
Bản xem trước của máy ảnh (hoặc kính ngắm) của các ứng dụng máy ảnh có thể bị lệch hoặc méo trên máy tính bảng, máy tính xách tay và màn hình có thể gập lại.
Vấn đề
Tài liệu định nghĩa về khả năng tương thích với Android nêu rõ rằng cảm biến hình ảnh của máy ảnh "PHẢI định hướng để chiều dài của máy ảnh phù hợp với chiều dài của màn hình".
Các ứng dụng thường giả định rằng hướng thiết bị và hướng cảm biến của máy ảnh dọc – một giả định hợp lý trên điện thoại di động tiêu chuẩn. Tuy nhiên, hướng tự nhiên của máy tính bảng, máy tính xách tay và cảm biến của máy ảnh có thể là ngang. Ngoài ra, các kiểu dáng mới như thiết bị có thể gập lại có thể có nhiều kiểu dáng và nhiều cảm biến của máy ảnh ở các hướng khác nhau.
Bắt đầu một hoạt động theo hướng máy ảnh mà ứng dụng không mong đợi hoặc việc chuyển đổi giữa các máy ảnh hoặc màn hình của thiết bị (đối với thiết bị có thể gập lại) có thể khiến bản xem trước của máy ảnh bị lệch hoặc méo.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/camera_preview_issue.png?authuser=9&hl=vi)
Bản xem trước của máy ảnh bị lệch và méo trên màn hình lớn có thể gập lại.
Tối ưu hoá
Ứng dụng máy ảnh phải xác định và quản lý chính xác hướng và máy ảnh của thiết bị hướng cảm biến để hiển thị bản xem trước của máy ảnh được căn chỉnh và điều chỉnh theo tỷ lệ một cách chính xác. Ứng dụng phải tính toán hướng xoay thiết bị, hướng xoay cảm biến và màn hình hoặc cửa sổ tỷ lệ khung hình, rồi áp dụng kết quả cho bản xem trước của máy ảnh. Để biết thông tin chi tiết hướng dẫn, hãy xem phần Bản xem trước của máy ảnh và Giới thiệu về máy ảnh Kính ngắm.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/camera_preview_optimization.png?authuser=9&hl=vi)
Bản xem trước của máy ảnh được căn chỉnh và điều chỉnh theo tỷ lệ một cách chính xác ở mọi hướng thiết bị.
Giải pháp về khả năng tương thích
Một thiết bị ở hướng tự nhiên khi Display#getRotation()
sẽ trả về Surface.ROTATION_0
. Hệ thống sẽ tính toán
CameraCharacteristics.SENSOR_ORIENTATION
so với hướng tự nhiên của thiết bị. Android căn chỉnh cửa sổ dọc của
các ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc theo hướng tự nhiên của thiết bị,
là điều mà hầu hết các ứng dụng đều mong đợi. Android cũng cắt hình ảnh cảm biến của máy ảnh khi
hướng cảm biến ở chế độ ngang và bản xem trước của máy ảnh ở chế độ dọc. Trường hợp cụ thể
bao gồm:
Buộc xoay bản xem trước của máy ảnh cho các ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc: Ứng dụng bị hạn chế ở hướng dọc nên mong đợi hướng tự nhiên của thiết bị và hướng cảm biến của máy ảnh theo hướng dọc. Tuy nhiên, trên Android 12 (API cấp 31) trở lên, ứng dụng có thể chạy ở nhiều hướng thiết bị nếu nhà sản xuất thiết bị bỏ qua thông số kỹ thuật về hướng.
Khi một ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc được kết nối với máy ảnh, Android sẽ buộc xoay ứng dụng để căn chỉnh cửa sổ dọc của ứng dụng với môi trường tự nhiên của thiết bị.
Trên một số máy tính bảng (xem thiết bị tham chiếu), ứng dụng cửa sổ dọc được xoay sang chế độ dọc toàn màn hình để căn chỉnh với hướng tự nhiên của thiết bị. Ứng dụng sẽ chiếm toàn màn hình sau khi bắt buộc xoay.
Máy tính bảng — Buộc xoay ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc.
Trên màn hình ngang bên trong của thiết bị có thể gập lại (xem tài liệu tham khảo) thiết bị), các hoạt động chỉ hiển thị theo hướng dọc sẽ được xoay thành ngang để phù hợp với hướng tự nhiên khi mở. Ứng dụng này hòm thư sau khi buộc xoay.
Có thể gập lại — Buộc xoay ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc. Ứng dụng cũng ở dạng hòm thư.
Cắt trường nhìn bên trong của camera trước: Cảm biến camera trong phía trước trên một số có thể gập lại theo hướng ngang. Ngoài việc buộc xoay bản xem trước camera trên màn hình bên trong có thể gập lại, Android cắt mặt trong phía trước trường nhìn của máy ảnh (ngang) để cảm biến chụp một góc nhìn đối diện hướng của thiết bị.
Buộc làm mới bản xem trước của máy ảnh: Hệ thống sẽ xoay vòng theo hoạt động phương thức
onStop()
vàonStart()
(theo mặc định) hoặconPause()
vàonResume()
(được áp dụng theo OVERRIDE_CAMERA_COMPAT_ENABLE_refRESH_VIA_PAUSE ghi đè cho mỗi ứng dụng) sau khi buộc xoay để đảm bảo bản xem trước của máy ảnh được hiển thị đúng cách.Điều chỉnh tỷ lệ khung hình: Hệ thống tự động thay đổi tỷ lệ khung hình của bản xem trước của máy ảnh bị buộc xoay thành tỷ lệ khung hình tối thiểu cao hơn, đảm bảo bản xem trước của máy ảnh được điều chỉnh theo tỷ lệ chính xác.
Nhà phát triển ứng dụng có thể ghi đè các giải pháp này nếu ứng dụng xử lý bản xem trước của máy ảnh chính xác. Hãy xem phần Ghi đè cho mỗi ứng dụng.
Những API thường bị sử dụng sai mục đích
Vì Android đã thêm hỗ trợ cho các tính năng như chế độ nhiều cửa sổ và các thiết bị như thiết bị có thể gập lại, API cũ đã ngừng hoạt động và được thay thế bằng các API mới nhất hoạt động được với mọi kích thước màn hình và dạng thiết bị yếu tố khác. Tuy nhiên, các API không dùng nữa vẫn có sẵn để quay lại sử dụng khả năng tương thích.
Một số API View
được thiết kế cho các mục đích đặc biệt, nhưng không phải lúc nào cũng hoạt động tốt
được nhà phát triển hiểu.
Vấn đề
Nhà phát triển tiếp tục sử dụng các API Display
không dùng nữa và giả định không chính xác
API trả về giới hạn đối với ứng dụng thay vì giới hạn đối với khu vực hiển thị của thiết bị. Hoặc nhà phát triển
sử dụng nhầm API khung hiển thị chuyên biệt để lấy chỉ số hiển thị chung.
Kết quả là tính toán nhầm khi định vị lại các phần tử trên giao diện người dùng sau cửa sổ ứng dụng
các sự kiện đổi kích thước, gây ra vấn đề về bố cục.
Những API Hiển thị không dùng nữa và thường bị sử dụng sai mục đích:
Để biết thêm thông tin, hãy xem Hỗ trợ chế độ nhiều cửa sổ.
Những API Khung hiển thị bị sử dụng sai mục đích:
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/misused_APIs_issue.png?authuser=9&hl=vi)
API không dùng nữa tính toán nhầm giới hạn đối với ứng dụng. Nội dung ứng dụng bị lệch ra khỏi màn hình.
Tối ưu hoá
Tuyệt đối không dựa vào kích thước màn hình thực tế để định vị các phần tử trên giao diện người dùng. Di chuyển
từ ứng dụng sang các API dựa trên WindowMetrics
, bao gồm cả các
Các API WindowManager
:
Nền tảng:
Jetpack:
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/misused_APIs_optimization.png?authuser=9&hl=vi)
API tính toán chính xác các chỉ số của cửa sổ ứng dụng.
Giải pháp về khả năng tương thích
2 chế độ ghi đè sẽ điều chỉnh các API Display
không dùng nữa và API View
bị sử dụng sai mục đích để
trả về giới hạn đối với ứng dụng:
ALWAYS_SANDBOX_DISPLAY_APIS
cho Display
API; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
cho các API View
. Theo mặc định, ALWAYS_SANDBOX_DISPLAY_APIS
cũng được áp dụng cho
những ứng dụng đủ điều kiện cho chế độ tương thích với kích thước.
Hoạt động rõ
Hoạt động rõ là kết quả của các kiểu nền trong suốt, đối với ví dụ:
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
Các giao diện liên quan đến hộp thoại (chẳng hạn như Theme.MaterialComponents.Dialog
) có thể
bao gồm các kiểu giúp hoạt động trở nên rõ ràng.
Các hoạt động rõ không bao gồm mọi không gian hiển thị có sẵn, khiến khó quản lý vì khu vực hiển thị có sẵn có thể thay đổi dựa trên các thay đổi về cấu hình như xoay thiết bị, gập và mở thiết bị cũng như chế độ nhiều cửa sổ.
Vấn đề
Hoạt động rõ cần tuân theo các giới hạn của hoạt động mờ đầu tiên bên dưới hoạt động rõ trong ngăn xếp hoạt động của tác vụ. Tuy nhiên, một phiên bản không rõ ràng hoạt động chạy hộp thoại cấp quyền có thể là đàn hồi (một hoạt động chạy một hoạt động khác rồi biến mất); và do đó, hệ thống không thể xác định các giới hạn của hoạt động đàn hồi khởi chạy hoạt động của hộp thoại cấp quyền minh bạch.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/transparent_activities_issue.png?authuser=9&hl=vi)
Hộp thoại bị đặt sai vị trí vì hoạt động được khởi chạy từ một thành phần phản cảm.
Tối ưu hoá
Hoạt động rõ kế thừa các hạn chế từ lớp mờ trên cùng nhất bên dưới chúng trong ngăn xếp hoạt động của tác vụ. Hoạt động mờ phải có sẵn cho toàn bộ vòng đời của hoạt động minh bạch, từ hoạt động sự sáng tạo đến huỷ diệt. Vì lý do này, không chạy các yêu cầu quyền từ hoạt động đàn hồi.
Nếu một hoạt động đàn hồi chạy một yêu cầu quyền, thì người dùng có thể không xem hộp thoại cấp quyền vì hoạt động đàn hồi sẽ bị huỷ trước khi người dùng có cơ hội phản hồi hộp thoại và kích thước và vị trí của hoạt động hộp thoại có thể đã được tính toán không chính xác.
Ứng dụng nên luôn chạy các yêu cầu quyền từ những hoạt động còn lại hiển thị cho đến khi người dùng đưa ra quyết định cấp quyền.
Góc bo tròn
Một hoạt động có thể có màu trong suốt do một kiểu chỉ định nền độ trong suốt hoặc do nội dung của hoạt động không lấp đầy khoảng trống không gian hiển thị. Nếu một hoạt động rõ lấp đầy không gian hiển thị có sẵn, hệ thống tự động áp dụng các góc bo tròn cho hoạt động khi được định cấu hình thành do nhà sản xuất thiết bị cung cấp. Tuy nhiên, nếu một hoạt động minh bạch (chẳng hạn như hộp thoại cấp quyền) không lấp đầy không gian có sẵn thì bạn có quyền quyết định có áp dụng góc tròn hay không.
Hộp thoại cấp quyền không lấp đầy không gian hiển thị có sẵn vì hộp thoại bố cục thường sử dụng LayoutParams.WRAP_CONTENT thay vì LayoutParams.MATCH_PARENT.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/transparent_activities_optimization.png?authuser=9&hl=vi)
Hộp thoại có góc bo tròn được định vị chính xác trên hoạt động chạy có thể nhìn thấy.
Giải pháp về khả năng tương thích
Duy trì hiển thị các hoạt động chạy hoạt động của hộp thoại cho đến khi người dùng hoàn tất đã phản hồi hộp thoại.
Hệ thống đảm bảo rằng một hoạt động rõ kế thừa tất cả các quy tắc ràng buộc từ hoạt động mờ đầu tiên bên dưới hoạt động rõ trong ngăn xếp hoạt động, bao gồm các hạn chế liên quan đến:
- Chế độ tương thích với kích thước
- Hướng
- Tỷ lệ khung hình
Trò chơi viết bằng Unity
Các trò chơi viết bằng Unity chạy trên toàn màn hình Android hoặc ở chế độ nhiều cửa sổ. Tuy nhiên, nhiều trò chơi viết bằng Unity bị mất tiêu điểm và ngừng vẽ nội dung khi ứng dụng được đặt trong chế độ nhiều cửa sổ.
Vấn đề
Unity đã thêm một Resizable Window
trong Unity 2019.4 để hỗ trợ chế độ nhiều cửa sổ trên Android. Tuy nhiên,
cách triển khai ban đầu không phản ứng với vòng đời hoạt động trong
chế độ nhiều cửa sổ đúng cách, khiến
UnityPlayer để tạm ngưng phát lại khi ứng dụng mất tiêu điểm. Người chơi đã kết xuất một
màn hình đen hoặc khung hình cuối cùng của trò chơi bị treo. Trò chơi chỉ được tiếp tục khi
người dùng đã nhấn vào màn hình. Nhiều ứng dụng dùng công cụ Unity gặp phải vấn đề này và
hiển thị dưới dạng một cửa sổ màu đen ở chế độ nhiều cửa sổ.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/unity_games_issue.gif?authuser=9&hl=vi)
Trò chơi mất tiêu điểm ở chế độ nhiều cửa sổ và hiển thị dưới dạng một cửa sổ màu đen.
Tối ưu hoá
Nâng cấp Unity lên 2019.4.40 trở lên rồi xuất lại trò chơi của bạn. Giữ nguyên
Đã đánh dấu vào Resizable Window
lựa chọn
Cài đặt Android Player, nếu không
trò chơi tạm dừng khi không được đặt tiêu điểm mặc dù trò chơi hoàn toàn hiển thị trong
chế độ nhiều cửa sổ.
![](https://developer.android.google.cn/static/images/guide/practices/compatibility-mode/unity_games_optimization.gif?authuser=9&hl=vi)
Trò chơi hiển thị nội dung chính xác ở chế độ nhiều cửa sổ ngay cả khi không được đặt tiêu điểm.
Giải pháp về khả năng tương thích
Nhà sản xuất thiết bị có thể áp dụng
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
ghi đè cho mỗi ứng dụng để cung cấp sự kiện lấy tiêu điểm giả cho một ứng dụng trong
chế độ nhiều cửa sổ. Tính năng ghi đè này cho phép hoạt động vẽ lại nội dung và
không bị bôi đen.
Kiểm thử ứng dụng để tìm vấn đề về khả năng tương thích
Để thử nghiệm ứng dụng của bạn và hiểu cách ứng dụng hoạt động trên nhiều kiểu dáng, hãy thực hiện các tài nguyên sau:
- Phát trực tuyến trên thiết bị: Để thử nghiệm ứng dụng của bạn trên các thiết bị phát hành công khai (bao gồm thiết bị tham chiếu) được lưu trữ trong các trung tâm dữ liệu của Google, hãy xem Tính năng Truyền trực tuyến trên thiết bị Android, sử dụng công nghệ Firebase
- Trình mô phỏng trong Android Studio Hedgehog: Để biết thông tin về cách tạo trình mô phỏng cho các thiết bị tham chiếu, hãy xem Tạo và quản lý thiết bị ảo
- Trình mô phỏng có thể đổi kích thước của Android Studio: Để biết thông tin về cách truy cập vào tài khoản ảo thiết bị, hãy xem bài viết Chạy ứng dụng trên Trình mô phỏng Android
Ở dạng hòm thư
Hãy xác minh rằng mỗi hoạt động có thể sử dụng tất cả không gian hiển thị có sẵn cho ứng dụng. Trước tiên, hãy khai báo mã sau trong thư mục kiểm thử:
Kotlin
fun Activity.isLetterboxed() : Boolean { if (isInMultiWindowMode) return false val wmc = WindowMetricsCalculator.getOrCreate() val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds val isScreenPortrait = maxBounds.height() > maxBounds.width() return if (isScreenPortrait) { currentBounds.height() < maxBounds.height() } else { currentBounds.width() < maxBounds.width() } }
Java
public boolean isLetterboxed(Activity activity) { if (activity.isInMultiWindowMode()) { return false; } WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate(); Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds() Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds(); boolean isScreenPortrait = maxBounds.height() > maxBounds.width(); return (isScreenPortrait) ? currentBounds.height() < maxBounds.height() : currentBounds.width() < maxBounds.width(); }
Sau đó, hãy chạy kiểm thử để xác nhận hành vi và đảm bảo hoạt động mục tiêu không ở dạng hòm thư:
Kotlin
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) @Test fun activity_launched_notLetterBoxed() { activityRule.scenario.onActivity { assertThat(it.isLetterboxed()).isFalse() } }
Java
@Rule public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class); public void activity_launched_notLetterBoxed() { try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity(activity -> { assertThat(isLetterboxed(activity)).isFalse(); }); } }
Tốt nhất là chỉ chạy loại kiểm thử này cho đến khi vượt qua và xác nhận rằng ứng dụng của bạn các hoạt động chiếm toàn bộ không gian hiển thị có sẵn cho ứng dụng. Kiểm thử ứng dụng trên mọi loại thiết bị để đảm bảo hoạt động nhất quán.
Ghi đè cho mỗi ứng dụng
Android cung cấp chế độ ghi đè để thay đổi hành vi được định cấu hình của các ứng dụng. Cho
Ví dụ: chế độ ghi đè FORCE_RESIZE_APP
sẽ hướng dẫn
hệ thống bỏ qua chế độ tương thích với kích thước và đổi kích thước ứng dụng cho vừa với màn hình
ngay cả khi resizeableActivity="false"
là
được chỉ định trong tệp kê khai ứng dụng.
Nhà sản xuất thiết bị sẽ áp dụng chế độ ghi đè cho một số ứng dụng hoặc tất cả ứng dụng trên các thiết bị có màn hình lớn cụ thể. Trên Android 14 (API cấp 34) trở lên, người dùng có thể áp dụng chế độ ghi đè cho các ứng dụng thông qua phần cài đặt thiết bị.
Ghi đè người dùng cho mỗi ứng dụng
Trên Android 14 trở lên, trình đơn cài đặt sẽ cho phép người dùng thay đổi khía cạnh giữa các ứng dụng. Các thiết bị có màn hình lớn như tệp tham chiếu thiết bị sẽ triển khai trình đơn này.
Trình đơn chứa danh sách tất cả các ứng dụng đã cài đặt trên thiết bị. Người dùng chọn một ứng dụng, sau đó đặt tỷ lệ khung hình của ứng dụng thành 3:4, 1:1, toàn màn hình hoặc giá trị khác do nhà sản xuất thiết bị định cấu hình. Người dùng cũng có thể đặt lại tỷ lệ khung hình thành giá trị mặc định của ứng dụng, được chỉ định trong tệp kê khai ứng dụng.
Ứng dụng có thể chọn không sử dụng chế độ ghi đè khả năng tương thích bằng cách đặt các thẻ PackageManager.Property
sau:
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE
Để chọn không sử dụng tính năng ghi đè khả năng tương thích với tỷ lệ khung hình của người dùng, hãy thêm thuộc tính này vào tệp kê khai ứng dụng của bạn rồi đặt giá trị thành
false
:<application> <property android:name="android.window. PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE" android:value="false" /> </application>
Ứng dụng của bạn sẽ được loại trừ khỏi danh sách ứng dụng trong phần cài đặt thiết bị. Số người dùng sẽ không thể ghi đè tỷ lệ khung hình của ứng dụng.
Việc đặt thuộc tính này thành
true
không có hiệu lực.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
Cách chọn không sử dụng chế độ toàn màn hình về khả năng tương thích với tỷ lệ khung hình của người dùng ghi đè, hãy thêm thuộc tính vào tệp kê khai ứng dụng và đặt giá trị thành
false
:<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE" android:value="false" /> </application>
Tuỳ chọn toàn màn hình sẽ bị xoá khỏi danh sách các tuỳ chọn tỷ lệ khung hình trong cài đặt thiết bị. Người dùng sẽ không thể áp dụng chế độ ghi đè toàn màn hình cho ứng dụng của bạn.
Việc đặt thuộc tính này thành
true
sẽ không có hiệu lực.
Tối ưu hoá ứng dụng cho mọi màn hình: Đừng đặt quy tắc hạn chế tỷ lệ khung hình trong ứng dụng của bạn. Sử dụng các lớp kích thước cửa sổ để hỗ trợ nhiều loại kích thước cửa sổ bố cục dựa trên lượng không gian hiển thị có sẵn.
Ghi đè cho mỗi ứng dụng của nhà sản xuất thiết bị
Nhà sản xuất thiết bị sẽ áp dụng chế độ ghi đè cho mỗi ứng dụng trên một số thiết bị. Thiết bị tham chiếu có thể áp dụng một số chế độ ghi đè cho một nhiều ứng dụng khác nhau theo mặc định.
Ứng dụng có thể chọn không sử dụng hầu hết các chế độ ghi đè (xem phần Cho mỗi ứng dụng ghi đè ở bên dưới).
Bạn có thể kiểm thử ứng dụng với các chế độ ghi đè được bật hoặc tắt bằng cách sử dụng khả năng tương thích khung (xem Công cụ khung tương thích). Khi được bật, các chế độ ghi đè sẽ áp dụng cho toàn bộ ứng dụng.
Bạn cũng có thể sử dụng Cầu gỡ lỗi Android (adb) để bật hoặc tắt các chế độ ghi đè và xác định chế độ ghi đè nào áp dụng cho ứng dụng của bạn.
Bạn có thể bật hoặc tắt các chế độ ghi đè như sau:
adb shell am compat enable/disable <override name/id> <package>
Đối với thiết bị tham chiếu, hãy kiểm tra xem chế độ ghi đè nào áp dụng cho ứng dụng của bạn:
adb shell dumpsys platform_compat | grep <package name>
Bảng sau đây liệt kê các cơ chế ghi đè có sẵn cùng với hướng dẫn về cách tối ưu hoá ứng dụng của bạn để ứng dụng không cần dựa vào chế độ ghi đè. Bạn có thể thêm gắn cờ thuộc tính vào tệp kê khai ứng dụng để chọn không sử dụng một số chế độ ghi đè.
Ghi đè cho mỗi ứng dụng | |||
---|---|---|---|
Loại | Tên | Mã nhận dạng | Nội dung mô tả |
Khả năng đổi kích thước | FORCE_RESIZE_APP | 174042936 | Bỏ qua chế độ tương thích với kích thước của ứng dụng khi thay đổi cấu hình. |
FORCE_NON_RESIZE_APP | 181136395 | Buộc ứng dụng chuyển vào chế độ tương thích với kích thước khi thay đổi cấu hình. | |
Tỷ lệ khung hình | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | Chế độ ghi đè yếu tố giám sát phải được bật để áp dụng mọi chế độ ghi đè khác cho tỷ lệ khung hình. |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | Nếu tuỳ chọn này được bật (mặc định), thì phạm vi ghi đè sẽ chỉ diễn ra đối với các hoạt động chỉ hiển thị theo hướng dọc. | |
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | Thay đổi tỷ lệ khung hình tối thiểu thành 3:2. | |
OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | Thay đổi tỷ lệ khung hình tối thiểu thành 16:9. | |
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN | 208648326 | Thay đổi tỷ lệ khung hình tối thiểu cho vừa 50% kích thước màn hình (hoặc tỷ lệ khung hình chia đôi màn hình). | |
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | Tắt chế độ ghi đè tỷ lệ khung hình tối thiểu để các ứng dụng hiển thị ở chế độ toàn màn hình khi thiết bị xoay dọc. | |
Hướng | OVERRIDE_ANY_ORIENTATION | 265464455 | Cho phép ghi đè mọi hướng. |
OVERRIDE_ANY_ORIENTATION_TO_USER | 310816437 | Thay thế các quy định hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | Ghi đè hướng thành hướng dọc khi một hoạt động có hướng không xác định. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR | 265451093 | Ghi đè hướng thành nosensor (sử dụng hướng tự nhiên của thiết bị) khi một hoạt động có hướng không xác định. |
|
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | Xoay 180 độ các ứng dụng chỉ hiển thị theo hướng ngang. | |
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | Giới hạn phạm vi ghi đè hướng ở thời điểm ứng dụng được kết nối với máy ảnh. | |
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | Đặt màn hình thành hướng ngang tự nhiên cố định khi một nhiệm vụ ở chế độ toàn màn hình (kể cả khi ở dạng hòm thư). | |
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | Bỏ qua các yêu cầu về hướng của ứng dụng để tránh xoay vòng lặp vô hạn. | |
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | Bỏ qua các yêu cầu về hướng lặp lại trong khi một hoạt động đang chạy lại. Nếu Android phát hiện thấy một ứng dụng đang yêu cầu ít nhất 2 hướng mới trong vòng 1 giây, thì hệ thống sẽ coi đây là một vòng lặp xoay vô hạn và áp dụng chế độ ghi đè. | |
OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | Ngăn hiệu ứng hòm thư bằng cách tắt chế độ cài đặt bỏ qua yêu cầu về hướng của nhà sản xuất thiết bị. | |
Sandbox API | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | Ngăn chặn sự thay đổi về hành vi của mọi API hiển thị. |
ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | Buộc các API Display trong ứng dụng trả về giới hạn đối với ứng dụng. API Display trả về giới hạn đối với khu vực hiển thị logic, nhưng đôi khi ứng dụng giả định rằng API Display trả về giới hạn đối với ứng dụng, dẫn đến các vấn đề liên quan đến giao diện người dùng. |
|
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | Buộc dùng các API View trong ứng dụng để trả về giới hạn đối với ứng dụng. API View trả về giới hạn đối với khu vực hiển thị logic, nhưng đôi khi ứng dụng giả định rằng API View trả về giới hạn đối với ứng dụng, dẫn đến các vấn đề liên quan đến giao diện người dùng. |
|
Khả năng tương thích với máy ảnh | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | Tắt tính năng buộc xoay. Theo mặc định, tất cả các ứng dụng máy ảnh có hướng cố định sẽ bị buộc xoay khi bản xem trước của máy ảnh đang mở. |
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | Xoá chế độ làm mới hoàn toàn mặc định được áp dụng khi bản xem trước của máy ảnh bị buộc xoay. | |
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | Chuyển quy trình làm mới hoàn toàn sang làm mới một phần khi bản xem trước của máy ảnh bị buộc xoay, giúp duy trì trạng thái trong khi buộc xoay. Theo mặc định, Android áp dụng một quy trình làm mới hoàn toàn khi bản xem trước của máy ảnh bị buộc xoay. Quá trình làm mới hoàn toàn có thể gây ra vấn đề khiến ứng dụng mất trạng thái hoặc bôi đen, tuỳ thuộc vào cách ứng dụng lưu trạng thái trước đó vào bộ nhớ đệm. | |
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | Cắt vùng đệm hình ảnh của trường nhìn bên trong của camera trước. Nếu chế độ ghi đè bị tắt, thì tính năng cắt của trường nhìn bên trong của camera trước sẽ bị xoá và trường nhìn của bản xem trước của camera sẽ tăng lên. Theo mặc định trên một số thiết bị có thể gập lại (xem các thiết bị tham chiếu), hệ thống sẽ cắt bản xem trước của tất cả ứng dụng camera khi dùng trường nhìn bên trong của camera trước. | |
Khác | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | Ngăn ứng dụng bị bôi đen khi ứng dụng bị mất tiêu điểm ở chế độ chia đôi màn hình. Ứng dụng sẽ chờ để có tiêu điểm trước khi vẽ nội dung ứng dụng. Điều này có thể khiến ứng dụng bị treo hoặc bị bôi đen. Chế độ ghi đè này cho phép Android gửi một sự kiện tiêu điểm giả cho ứng dụng. Sự kiện này sẽ báo hiệu cho ứng dụng để bắt đầu vẽ lại nội dung. |
FORCE_RESIZE_APP
Buộc các gói được áp dụng chế độ ghi đè phải có thể đổi kích thước. Không thay đổi việc có thể đặt ứng dụng ở chế độ nhiều cửa sổ hay không, nhưng cho phép để đổi kích thước mà không cần chuyển sang chế độ tương thích với kích thước khi màn hình đổi kích thước.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Trong tệp kê khai ứng dụng, hãy đặt giá trị
android:resizeableActivity
cho true
hoặc thành
hỗ trợ đổi kích thước trong khi tắt chế độ nhiều cửa sổ bằng
android:resizeableActivity=false
, hãy thiết lập android.supports_size_changes
cờ siêu dữ liệu thành true
.
Cách tối ưu hoá ứng dụng
Sử dụng các bố cục thích ứng để cho phép ứng dụng thích ứng với mọi kích thước hiển thị và tỷ lệ khung hình. Xem Hỗ trợ nhiều kích thước màn hình.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
thành
false
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè và làm cho ứng dụng có thể đổi kích thước:
adb shell am compat enable FORCE_RESIZE_APP <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable FORCE_RESIZE_APP <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
FORCE_NON_RESIZE_APP
Buộc các gói được áp dụng chế độ ghi đè phải có thể đổi kích thước và không được vào chế độ tương thích với kích thước khi thay đổi cấu hình.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Đặt cả thuộc tính android:resizeableActivity
và
Cờ siêu dữ liệu android.supports_size_changes
thành false
trong tệp kê khai ứng dụng,
và khai báo quy tắc hạn chế hướng hoặc tỷ lệ khung hình.
Cách tối ưu hoá ứng dụng
Tất cả các ứng dụng hoạt động tốt nếu được đổi kích thước phải có
Đã đặt android:resizeableActivity
hoặc android.supports_size_changes
thành true
.
Bạn phải cải thiện các ứng dụng khác để chúng hoạt động tốt khi được đổi kích thước. Xem
android:resizeableActivity.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
thành
false
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè và làm cho ứng dụng không thể đổi kích thước:
adb shell am compat enable FORCE_NON_RESIZE_APP <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable FORCE_NON_RESIZE_APP <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_MIN_ASPECT_RATIO
Yếu tố giám sát tất cả chế độ ghi đè buộc có một tỷ lệ khung hình tối thiểu nhất định.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Đặt android:minAspectRatio
ở cấp hoạt động hoặc cấp ứng dụng.
Cách tối ưu hoá ứng dụng
Không đặt các quy tắc hạn chế tỷ lệ khung hình trong ứng dụng. Đảm bảo rằng ứng dụng của bạn hỗ trợ
kích thước màn hình khác nhau. Sử dụng các lớp kích thước cửa sổ
để hỗ trợ nhiều bố cục dựa trên lượng không gian mà ứng dụng của bạn có trên
màn hình. Xem API Compose WindowSizeClass
và Xem API WindowSizeClass
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Hãy chỉ định quy định hạn chế về tỷ lệ khung hình hoặc đặt cờ cho thuộc tính
PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE
thành false
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
Hạn chế các chế độ cài đặt ứng dụng buộc sử dụng một tỷ lệ khung hình tối thiểu nhất định cho các hoạt động
chỉ theo hướng dọc. Được bật theo mặc định và chỉ có hiệu lực
nếu bạn cũng bật OVERRIDE_MIN_ASPECT_RATIO
.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tối ưu hoá ứng dụng
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
Đặt tỷ lệ khung hình tối thiểu của hoạt động thành một giá trị trung bình (3:2)
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tối ưu hoá ứng dụng
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_MIN_ASPECT_RATIO_LARGE
Đặt tỷ lệ khung hình tối thiểu của hoạt động thành một giá trị lớn (16:9)
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tối ưu hoá ứng dụng
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
Cho phép sử dụng tỷ lệ khung hình chia đôi màn hình. Cho phép ứng dụng dùng tất cả không gian còn trống ở chế độ chia đôi màn hình, tránh hiệu ứng hòm thư.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tối ưu hoá ứng dụng
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
Tắt chế độ ghi đè tỷ lệ khung hình tối thiểu ở chế độ toàn màn hình dọc để sử dụng tất cả chế độ cài đặt không gian màn hình còn trống.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tối ưu hoá ứng dụng
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Xem OVERRIDE_MIN_ASPECT_RATIO.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_ANY_ORIENTATION
Bật các cơ chế ghi đè sau để ghi đè mọi hướng:
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Đặt thuộc tính tệp kê khai activity:screenOrientation
,
hoặc dùng API Activity#setRequestedOrientation()
.
Cách tối ưu hoá ứng dụng
Ứng dụng của bạn phải hỗ trợ tất cả các hướng. Thay đổi hướng là
thay đổi cấu hình, có thể được xử lý bằng một trong hai cách: cho phép
huỷ bỏ và tạo lại ứng dụng, hoặc quản lý các thay đổi về cấu hình
chính bạn. Nếu bạn tự quản lý các thay đổi về cấu hình, trạng thái ứng dụng có thể là
được giữ lại bằng cách sử dụng ViewModel
. Trong rất ít trường hợp, bạn có thể quyết định khoá
chỉ hướng trên màn hình nhỏ, mặc dù làm như vậy có thể không điều chỉnh được theo tỷ lệ
cho phép người dùng xoay ứng dụng khi cần. Trên Android 12L trở lên,
hướng cố định có thể bị cấu hình thiết bị ghi đè. Để biết thêm
thông tin về cách xử lý các thay đổi về cấu hình và hỗ trợ tất cả
hướng, hãy xem Xử lý các thay đổi về cấu hình,
Tổng quan về ViewModel và Hướng ứng dụng bị hạn chế đang bật
nhưng không phải trên các thiết bị màn hình lớn.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
đến false
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
Hàm OVERRIDE_ANY_ORIENTATION_TO_USER
Cho phép ứng dụng lấp đầy không gian hiển thị có sẵn. Ghi đè mọi hướng,
các quy định hạn chế về khả năng đổi kích thước và tỷ lệ khung hình được chỉ định trong tệp kê khai ứng dụng. Ngoài ra
bỏ qua mọi lệnh gọi đến
Activity#setRequestedOrientation()
.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Không đặt tệp kê khai
android:screenOrientation
hoặc đặt thuộc tính thành"user"
.Đặt tệp kê khai
android:resizeableActivity
chotrue
.Trên màn hình nhỏ, để hỗ trợ việc đổi kích thước ứng dụng trong khi tắt chế độ nhiều cửa sổ bằng
android:resizeableActivity=false
, hãy đặt Cờ siêu dữ liệuandroid.supports_size_changes
thànhtrue
. Không đặtminAspectRatio
vàmaxAspectRatio
.
Cách tối ưu hoá ứng dụng
Cho phép ứng dụng của bạn hỗ trợ tất cả các hướng; đừng đặt screenOrientation
trong tệp kê khai của ứng dụng. Hỗ trợ khả năng đổi kích thước ứng dụng,
chế độ nhiều cửa sổ cũng như tất cả tỷ lệ khung hình của màn hình bằng cách đặt
Thuộc tính android:resizeableActivity
trong tệp kê khai của ứng dụng vào true
. Xem
Hỗ trợ nhiều kích thước màn hình.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
Bật hướng dọc cho tất cả các hoạt động trong gói. Trừ phi Đã bật OVERRIDE_ANY_ORIENTATION, chế độ ghi đè chỉ được dùng khi hoạt động không chỉ định hướng cố định nào khác.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tối ưu hoá ứng dụng
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
Bật hướng nosensor cho tất cả các hoạt động trong . Trừ phi OVERRIDE_ANY_ORIENTATION là đã bật, chế độ ghi đè chỉ được dùng khi không có hướng cố định nào khác do hoạt động chỉ định.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tối ưu hoá ứng dụng
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Bật hướng reverseLandscape cho tất cả các hoạt động trong gói. Trừ phi OVERRIDE_ANY_ORIENTATION là đã bật, chế độ ghi đè chỉ được dùng khi không có hướng cố định nào khác do hoạt động chỉ định.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tối ưu hoá ứng dụng
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
Giới hạn OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR, và OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE chế độ ghi đè để chỉ có hiệu lực khi kết nối máy ảnh đang hoạt động.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tối ưu hoá ứng dụng
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
Hạn chế hướng hiển thị theo hướng ngang tự nhiên khi các điều kiện sau:
- Hoạt động ở chế độ toàn màn hình
- Chọn không sử dụng thuộc tính thành phần
Chưa bật
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
- Chế độ cài đặt bỏ qua yêu cầu về hướng của nhà sản xuất thiết bị được bật cho màn hình
- Hướng tự nhiên của màn hình là hướng ngang
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Không có. Sự cố sẽ được giải quyết trong logic ứng dụng.
Cách tối ưu hoá ứng dụng
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
đến false
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
Bật chính sách về khả năng tương thích để bỏ qua bước cập nhật hướng ứng dụng để phản hồi ứng dụng
gọi Activity#setRequestedOrientation()
khi ứng dụng
đang chạy lại hoặc có một chế độ xử lý khả năng tương thích với máy ảnh đang hoạt động.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
đến true
.
Cách tối ưu hoá ứng dụng
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
đến false
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
Bật chính sách về khả năng tương thích nhưng bỏ qua hướng được yêu cầu của một ứng dụng trong
phản hồi khi ứng dụng gọi
Activity#setRequestedOrientation()
hơn 2 lần
trong một giây nếu một hoạt động không được tạo hiệu ứng hòm thư cho hướng cố định.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Không có. Sự cố sẽ được giải quyết trong logic ứng dụng.
Cách tối ưu hoá ứng dụng
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
thành
false
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
android:value="false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION
Loại trừ các gói khỏi hành vi bỏ qua yêu cầu về hướng có thể được bật theo nhà sản xuất thiết bị cho một khu vực hiển thị hoặc toàn bộ màn hình.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Không có. Sự cố sẽ được giải quyết trong logic ứng dụng.
Cách tối ưu hoá ứng dụng
Hãy xem OVERRIDE_ANY_ORIENTATION
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Không chọn không sử dụng. Việc tắt chế độ ghi đè có thể nguy hiểm nếu ứng dụng không tương thích với một thiết bị có nhà sản xuất thiết bị bỏ qua yêu cầu về hướng bật chế độ cài đặt. Liên hệ với Nhà phát triển Android Quan hệ để tắt chế độ ghi đè.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Không có cờ thuộc tính nào cho chế độ ghi đè này.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
NEVER_SANDBOX_DISPLAY_APIS
Buộc các gói không bao giờ áp dụng hộp cát API Display
cho một hoạt động ở chế độ hòm thư hoặc tương thích với kích thước. Các API Display
tiếp tục cung cấp các giới hạn về khu vực hiển thị.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Khai báo các hoạt động có thể đổi kích thước bằng cách đặt thuộc tính
Thuộc tính tệp kê khai android:resizeableActivity
cho true
hoặc cờ siêu dữ liệu android.supports_size_changes
đến true
.
Cách tối ưu hoá ứng dụng
Những ứng dụng tuyên bố là hoàn toàn có thể đổi kích thước phải tuyệt đối không dựa vào kích thước màn hình
để định vị các phần tử trên giao diện người dùng. Di chuyển ứng dụng của bạn sang các API mới nhất
cung cấp WindowMetrics
. Nếu bạn đang dùng Jetpack Compose, hãy tận dụng
WindowSizeClass
API để vẽ giao diện người dùng dựa trên kích thước màn hình
khu vực mà ứng dụng có trên màn hình hiện tại. Xem
Các lớp kích thước cửa sổ.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Không chọn không sử dụng. Di chuyển từ các API không dùng nữa.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Không có cờ thuộc tính nào cho chế độ ghi đè này.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
ALWAYS_SANDBOX_DISPLAY_APIS
Buộc các gói luôn áp dụng hộp cát API Display
bất kể chế độ kết xuất cửa sổ hiện tại. Các API Display
luôn cung cấp các giới hạn đối với ứng dụng.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Khai báo các hoạt động không thể đổi kích thước bằng cách đặt thuộc tính
android:resizeableActivity
cho false
hoặc
Cờ siêu dữ liệu android.supports_size_changes
thành false
.
Cách tối ưu hoá ứng dụng
Những ứng dụng tuyên bố là hoàn toàn có thể đổi kích thước phải tuyệt đối không dựa vào kích thước màn hình để
xác định vị trí các phần tử trên giao diện người dùng. Di chuyển ứng dụng của bạn từ các API không dùng nữa sang
các API mới nhất cung cấp WindowMetrics
. Xem
WindowMetricsCalculator
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Không chọn không sử dụng. Di chuyển từ các API không dùng nữa.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Không có cờ thuộc tính nào cho chế độ ghi đè này.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
Buộc các gói tạo hộp cát cho các API View
sau đây đối với giới hạn hoạt động:
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Giải quyết vấn đề trong mã xử lý ứng dụng bằng cách sử dụng các API cung cấp các giới hạn của cửa sổ ứng dụng và độ lệch tương ứng với cửa sổ ứng dụng thay vì các giới hạn của màn hình thiết bị và độ lệch tương ứng với màn hình thiết bị.
Cách tối ưu hoá ứng dụng
Ứng dụng phải dùng các API View
, có tính đến khả năng tạo hiệu ứng hòm thư
và chế độ nhiều cửa sổ được áp dụng cho ứng dụng. Xem
WindowMetricsCalculator
.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS
đến false
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
android:value="false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
Tắt tính năng buộc xoay. Cải thiện trải nghiệm người dùng trên một số ứng dụng.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Đặt cờ thuộc tính
PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
đến false
.
Cách tối ưu hoá ứng dụng
Đừng dựa vào hướng cảm biến của máy ảnh được lưu vào bộ nhớ đệm hoặc thông tin thiết bị. Cho hướng dẫn về khả năng tương thích với máy ảnh, hãy xem Giới thiệu về Kính ngắm của máy ảnh và Hỗ trợ giao diện có thể đổi kích thước trong camera .
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
đến true
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè để loại bỏ tính năng buộc xoay:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Cách loại bỏ chế độ ghi đè để cho phép thực hiện buộc xoay:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH
Tắt chế độ làm mới hoạt động sau khi buộc xoay. Cải thiện trải nghiệm người dùng khi quá trình làm mới làm mất trạng thái trong ứng dụng.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Đặt cờ thuộc tính
PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
đến false
.
Cách tối ưu hoá ứng dụng
Xem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
đến true
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè để xoá chế độ làm mới hoạt động:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Cách xoá chế độ ghi đè để cho phép chế độ làm mới hoạt động:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
Tạo các gói được áp dụng để làm mới hoạt động bằng onResume()
→ onPause()
→ onResume()
chu kỳ thay vì onResume()
→
onStop()
→ onResume()
sau khi buộc xoay để tương thích với máy ảnh.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Đặt cờ thuộc tính
PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
đến true
.
Cách tối ưu hoá ứng dụng
Xem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
đến false
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT
Buộc cắt đầu ra của máy ảnh theo hướng đối diện khi chụp dọc hướng của máy ảnh không phù hợp với hướng tự nhiên của thiết bị. Nhiều ứng dụng không xử lý trường hợp này và hiển thị hình ảnh bị kéo giãn.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
đến true
.
Cách tối ưu hoá ứng dụng
Xem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
đến false
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè để áp dụng tính năng cắt trường nhìn bên trong của camera trước:
adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Cách xoá chế độ ghi đè để xoá tính năng cắt trường nhìn bên trong của camera trước:
adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION
Ngăn các ứng dụng chọn không chia sẻ màn hình ứng dụng (xem
Chiếu nội dung nghe nhìn). Được triển khai khi ứng dụng sử dụng sai mục đích
createConfigForDefaultDisplay()
API bắt buộc
chụp toàn màn hình và gây nguy hiểm cho quyền riêng tư của người dùng do tiết lộ nội dung
thông báo được chụp ở chế độ toàn màn hình nhưng không chụp bằng màn hình ứng dụng
chia sẻ và tất cả ứng dụng bất kể chế độ cửa sổ.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Cho phép hành vi chiếu nội dung đa phương tiện mặc định (triển khai trong Android 14, API
cấp 34, với createScreenCaptureIntent()
),
tính năng này cho phép người dùng quyết định xem nên chia sẻ toàn màn hình hay chia sẻ một ứng dụng
bất kể chế độ kết xuất cửa sổ hiện tại. Hoặc gọi
createScreenCaptureIntent(MediaProjectionConfig)
có đối số MediaProjectionConfig
được trả về từ một
cuộc gọi đến createConfigForUserChoice()
.
Cách tối ưu hoá ứng dụng
Cho phép người dùng chọn chia sẻ toàn bộ màn hình thiết bị hoặc chia sẻ một ứng dụng cửa sổ trong khi chiếu nội dung đa phương tiện. Kể từ Android 14 là hành vi mặc định.
Làm cho ứng dụng có thể đổi kích thước (resizeableActivity="true"
) để
hỗ trợ chế độ nhiều cửa sổ.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Do tính nghiêm trọng của quyền riêng tư của người dùng, nên ứng dụng của bạn không thể tắt hoặc chọn không sử dụng của chế độ ghi đè này.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
Không có.
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè để huỷ chế độ chọn không chia sẻ một phần màn hình của ứng dụng (nghĩa là bật tính năng chia sẻ màn hình một phần):
adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Cách xoá chế độ ghi đè để cho phép ứng dụng chọn không sử dụng một phần màn hình đang chia sẻ:
adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
Cho phép gửi tiêu điểm giả cho các ứng dụng không có tiêu điểm ở chế độ chia đôi màn hình. Hơi nhiều công cụ phát triển trò chơi chờ lấy tiêu điểm rồi mới vẽ nội dung của ứng dụng; và do đó, tiêu điểm giả giúp ứng dụng tránh bị bôi đen khi chúng được tiếp tục và không nhưng cần tập trung.
Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
đến
true
.
Cách tối ưu hoá ứng dụng
Bạn có thể tránh vấn đề này nếu ứng dụng của bạn xử lý nhiều hướng và cấu hình thay đổi tốt. Hãy làm cho màn hình lớn của ứng dụng sẵn sàng hoạt động bằng cách làm theo Nguyên tắc về chất lượng ứng dụng có màn hình lớn.
Nếu bạn chạy công cụ phát triển trò chơi Unity, hãy nâng cấp lên phiên bản 2019.4.40 trở lên và
xuất lại trò chơi của bạn. Giữ nguyên lựa chọn Resizable Window
đã đăng ký trong Android Player
phần cài đặt.
Cách tắt hoặc chọn không sử dụng chế độ ghi đè
Đặt cờ thuộc tính
PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
đến
false
.
Cờ thuộc tính để điều chỉnh chế độ ghi đè
<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
android:value="true|false"/>
Lệnh adb để kiểm thử chế độ ghi đè
Cách áp dụng chế độ ghi đè:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
Cách xoá chế độ ghi đè:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.
Tài nguyên khác
- Nguyên tắc về chất lượng ứng dụng có màn hình lớn
- Nguyên tắc về chất lượng cốt lõi của ứng dụng.